TypeScript provém vários tipos utilitários para facilitar transformações de tipo comum. Esses utilitários estão disponíveis globalmente.
Partial<Type>
Constrói um tipo com todas as propriedades de Type
definidas como opcionais. Esse utilitário irá retornar um tipo que representa todos os subconjuntos de um determinado tipo.
Exemplo
tsTry
interfaceTodo {titulo : string;descricao : string;}functionatualizaTodo (todo :Todo ,camposParaAtualizar :Partial <Todo >) {return { ...todo , ...camposParaAtualizar };}consttodo1 = {titulo : "organizar a mesa",descricao : "limpar bagunça",};consttodo2 =atualizaTodo (todo1 , {descricao : "tirar o lixo",});
Readonly<Type>
Constrói um tipo com todas as propriedades de Type
definidas como readonly
, significando que as propriedades do tipo construído não podem ser reatribuídas.
Exemplo
tsTry
interfaceTodo {titulo : string;}consttodo :Readonly <Todo > = {titulo : "Deleta usuários inativos",};Cannot assign to 'titulo' because it is a read-only property.2540Cannot assign to 'titulo' because it is a read-only property.todo .= "Olá"; titulo
Esse utilitário é útil para representar expressões de atribuição que irão falhar em tempo de execução (Ex. Ao tentar reatribuir propriedades de um objeto congelado).
Object.freeze
ts
function freeze<Type>(obj: Type): Readonly<Type>;
Record<Keys,Type>
Constrói um tipo com um conjunto de propriedades Keys
do tipo Type
. Esse utilitário pode ser usado para mapear as propriedades de um tipo para outro tipo.
Exemplo
tsTry
interfaceInfoPagina {titulo : string;}typePagina = "inicio" | "sobre" | "contato";constnav :Record <Pagina ,InfoPagina > = {sobre : {titulo : "sobre" },contato : {titulo : "contato" },inicio : {titulo : "inicio" },};nav .sobre ;
Pick<Type, Keys>
Constrói um tipo pegando um conjunto de propriedades Keys
de Type
.
Exemple
tsTry
interfaceTodo {titulo : string;descricao : string;completado : boolean;}typeTodoPreVisualizacao =Pick <Todo , "titulo" | "completado">;consttodo :TodoPreVisualizacao = {titulo : "Limpar quarto",completado : false,};todo ;
Omit<Type, Keys>
Constrói um tipo pegando todas as propriedades de Type
e então removendo Keys
.
Exemplo
tsTry
interfaceTodo {titulo : string;descricao : string;completado : boolean;}typeTodoPreVisualizacao =Omit <Todo , "descricao">;consttodo :TodoPreVisualizacao = {titulo : "Limpar quarto",completado : false,};todo ;
Exclude<Type, ExcludedUnion>
Constrói um tipo excluindo de Type
todos membros de união que são atribuíveis a ExcludedUnion
.
Exemplo
tsTry
typeT0 =Exclude <"a" | "b" | "c", "a">;typeT1 =Exclude <"a" | "b" | "c", "a" | "b">;typeT2 =Exclude <string | number | (() => void),Function >;
Extract<Type, Union>
Constrói um tipo extraindo de Type
todos membros de união que são atribuíveis a Union
.
Exemplo
tsTry
typeT0 =Extract <"a" | "b" | "c", "a" | "f">;typeT1 =Extract <string | number | (() => void),Function >;
NonNullable<Type>
Constrói um tipo por excluir null
e undefined
de Type
.
Example
tsTry
typeT0 =NonNullable <string | number | undefined>;typeT1 =NonNullable <string[] | null | undefined>;
Parameters<Type>
Constrói uma tipo tupla a partir de tipos usados nos parâmetros de uma função tipo Type
.
Exemplo
tsTry
declare functionf1 (arg : {a : number;b : string }): void;typeT0 =Parameters <() => string>;typeT1 =Parameters <(s : string) => void>;typeT2 =Parameters <<T >(arg :T ) =>T >;typeT3 =Parameters <typeoff1 >;typeT4 =Parameters <any>;typeT5 =Parameters <never>;typeType 'string' does not satisfy the constraint '(...args: any) => any'.2344Type 'string' does not satisfy the constraint '(...args: any) => any'.T6 =Parameters <string >;typeType 'Function' does not satisfy the constraint '(...args: any) => any'. Type 'Function' provides no match for the signature '(...args: any): any'.2344Type 'Function' does not satisfy the constraint '(...args: any) => any'. Type 'Function' provides no match for the signature '(...args: any): any'.T7 =Parameters <>; Function
ConstructorParameters<Type>
Constrói um tipo tupla ou array a partir dos tipos de um tipo função construtora. Isso gera um tipo tupla com todos os tipos parâmetros (ou o tipo never
se Type
não for uma função).
Exemplo
tsTry
typeT0 =ConstructorParameters <ErrorConstructor >;typeT1 =ConstructorParameters <FunctionConstructor >;typeT2 =ConstructorParameters <RegExpConstructor >;typeT3 =ConstructorParameters <any>;typeType 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'. Type 'Function' provides no match for the signature 'new (...args: any): any'.2344Type 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'. Type 'Function' provides no match for the signature 'new (...args: any): any'.T4 =ConstructorParameters <>; Function
ReturnType<Type>
Constrói um tipo consistindo do tipo retorno da função Type
.
Exemplo
tsTry
declare functionf1 (): {a : number;b : string };typeT0 =ReturnType <() => string>;typeT1 =ReturnType <(s : string) => void>;typeT2 =ReturnType <<T >() =>T >;typeT3 =ReturnType <<T extendsU ,U extends number[]>() =>T >;typeT4 =ReturnType <typeoff1 >;typeT5 =ReturnType <any>;typeT6 =ReturnType <never>;typeType 'string' does not satisfy the constraint '(...args: any) => any'.2344Type 'string' does not satisfy the constraint '(...args: any) => any'.T7 =ReturnType <string >;typeType 'Function' does not satisfy the constraint '(...args: any) => any'. Type 'Function' provides no match for the signature '(...args: any): any'.2344Type 'Function' does not satisfy the constraint '(...args: any) => any'. Type 'Function' provides no match for the signature '(...args: any): any'.T8 =ReturnType <>; Function
InstanceType<Type>
Constrói um tipo consistindo do tipo instancia de uma função construtora em Type
.
Exemplo
tsTry
classC {x = 0;y = 0;}typeT0 =InstanceType <typeofC >;typeT1 =InstanceType <any>;typeT2 =InstanceType <never>;typeType 'string' does not satisfy the constraint 'abstract new (...args: any) => any'.2344Type 'string' does not satisfy the constraint 'abstract new (...args: any) => any'.T3 =InstanceType <string >;typeType 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'. Type 'Function' provides no match for the signature 'new (...args: any): any'.2344Type 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'. Type 'Function' provides no match for the signature 'new (...args: any): any'.T4 =InstanceType <>; Function
Required<Type>
Constrói um tipo consistindo de todas propriedades de T
definidas como obrigatórias. O oposto de Partial
.
Exemplo
tsTry
interfaceProps {a ?: number;b ?: string;}constobj :Props = {a : 5 };constProperty 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.2741Property 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.: obj2 Required <Props > = {a : 5 };
ThisParameterType<Type>
Extrai o tipo do parâmetro this para um tipo function
, ou unknown se o tipo da função não tem o parâmetro this
.
Exemplo
tsTry
functionparaHex (this :Number ) {return this.toString (16);}functionnumeroToString (n :ThisParameterType <typeofparaHex >) {returnparaHex .apply (n );}
OmitThisParameter<Type>
Remove o parâmetro this
de Type
. Se Type
não tem parâmetro this
explicitamente declarado, o resultado é simplesmente Type
. Caso contrário, um novo tipo função sem o parâmetro this
é criado a partir de Type
. Generics são apagados e apenas a ultima assinatura sobrecarregada é propagada para o novo tipo função.
Exemplo
tsTry
functionparaHex (this :Number ) {return this.toString (16);}constcincoParaHex :OmitThisParameter <typeofparaHex > =paraHex .bind (5);console .log (cincoParaHex ());
ThisType<Type>
Esse utilitário não retorna um tipo transformado. Ao invés, serve como um marcador para um tipo contextual this
. Note que a flag --noImplicitThis
precisa ser ativada para usar esse utilitário.
Exemplo
tsTry
typeDescritorDeObjeto <D ,M > = {dado ?:D ;metodos ?:M &ThisType <D &M >; // Tipo de this em metodos é D & M};functionfazObjeto <D ,M >(desc :DescritorDeObjeto <D ,M >):D &M {letdado : object =desc .dado || {};letmetodos : object =desc .metodos || {};return { ...dado , ...metodos } asD &M ;}letobj =fazObjeto ({dado : {x : 0,y : 0 },metodos : {moveBy (dx : number,dy : number) {this.x +=dx ; // this fortemente tipadothis.y +=dy ; // this fortemente tipado},},});obj .x = 10;obj .y = 20;obj .moveBy (5, 5);
No exemplo acima, o objeto metodos
no argumento para fazObjeto
tem um tipo contextual que inclui EsseTipo<D & M>
portanto o tipo de this em metodos dentro do objeto metodos
é { x: number, y: number } & { movePor(dx: number, dy: number): number }
. Perceba como o tipo da propriedade metodos
é simultaneamente uma interface alvo e a fonte para o tipo this
nos metodos.
O marcador interface EsseTipo<T>
é simplesmente uma interface vazia declarada em lib.d.ts
. Além de ser reconhecida no tipo contextual de um objeto literal, a interface age como qualquer interface vazia.