Pular para o conteúdo

Gramática de tipos

Os tipos podem ser nomeados diretamente ou qualificados por meio de um namespace:

String
Geometry.Point

Argumentos 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.

Acrescente ? quando um valor também puder ser nil:

String?

A forma geral de união combina alternativas com |:

String | Int | nil

Essa união de tipos é diferente de uma union discriminada declarada: uma união discriminada fornece às alternativas casos nomeados e payloads opcionais.

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>

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): String
function(message: String)

Um resultado de função entre parênteses declara um pacote exato e fixo de resultados:

function(value: Int): (Int, String)

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.