Gramática de tipos
Tipos nomeados e genéricos
Seção intitulada “Tipos nomeados e genéricos”Os tipos podem ser nomeados diretamente ou qualificados por meio de um namespace:
StringGeometry.PointArgumentos genéricos usam sinais de menor e maior na sintaxe de tipos:
Array<String>Table<String, Int>Argumentos de chamadas genéricas usam sinais de menor e maior duplicados para permanecerem distintos dos operadores de comparação:
Array.create<<Int>>(4, 0)identity<<String>>("Pop")Funções, registros e uniões discriminadas podem declarar parâmetros de tipo. Na rc.3, as chamadas devem fornecer explicitamente todos os argumentos de tipo; os literais de registro obtêm seu tipo genérico concreto de uma anotação ou de outro contexto esperado.
Tipos opcionais e uniões
Seção intitulada “Tipos opcionais e uniões”Acrescente ? quando um valor também puder ser nil:
String?A forma geral de união combina alternativas com |:
String | Int | nilEssa união de tipos é diferente de uma union discriminada declarada: uma união discriminada fornece às alternativas casos nomeados e payloads opcionais.
Arrays e tabelas
Seção intitulada “Arrays e tabelas”Os tipos de array possuem formas curta e nomeada equivalentes:
{String}Array<String>Tabelas tipadas também possuem duas formas:
{[String]: Int}Table<String, Int>Tuplas e funções
Seção intitulada “Tuplas e funções”Uma tupla relaciona tipos de elementos posicionais:
(String, Int, Boolean)Um tipo de função relaciona parâmetros nomeados e um resultado opcional:
function(value: Int): Stringfunction(message: String)Um resultado de função entre parênteses declara um pacote exato e fixo de resultados:
function(value: Int): (Int, String)Aliases de tipo
Seção intitulada “Aliases de tipo”Um alias de namespace fornece outro nome no código-fonte a um tipo existente:
public type Scores = {[String]: Int}A forma inicial de alias não é genérica. Ela é apagada para seu destino antes da HIR e não acrescenta uma nova identidade em tempo de execução.
Parênteses agrupam tipos compostos quando necessário. A grafia do tipo não causa conversões implícitas: exceto pelos aliases, os valores devem satisfazer o tipo esperado exato ou uma relação de união/interface explicitamente permitida.
