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
tsTryinterfaceTodo {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
tsTryinterfaceTodo {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
tsfunction 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
tsTryinterfaceInfoPagina {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
tsTryinterfaceTodo {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
tsTryinterfaceTodo {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
tsTrytypeT0 =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
tsTrytypeT0 =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
tsTrytypeT0 =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
tsTrydeclare 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
tsTrytypeT0 =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
tsTrydeclare 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
tsTryclassC {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
tsTryinterfaceProps {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
tsTryfunctionparaHex (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
tsTryfunctionparaHex (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
tsTrytypeDescritorDeObjeto <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.