'desconhecido' vs. 'qualquer'


190

O TypeScript 3.0 apresenta o unknowntipo, de acordo com o wiki:

unknown agora é um nome de tipo reservado, pois agora é um tipo interno. Dependendo do uso pretendido de desconhecido, convém remover completamente a declaração (favorecendo o tipo desconhecido recém-introduzido) ou renomeá-la para outra coisa.

Qual é a diferença entre unknowne any? Quando devemos usar unknownmais any?

Respostas:


233

Você pode ler mais sobre unknowno anúncio de RP ou RC , mas a essência é:

[...] desconhecido, qual é o equivalente seguro de qualquer tipo. Qualquer coisa é atribuível a desconhecido, mas desconhecido não é atribuível a nada além de si próprio e de qualquer pessoa sem uma asserção de tipo ou um estreitamento baseado no fluxo de controle. Da mesma forma, nenhuma operação é permitida em um desconhecido sem primeiro afirmar ou restringir a um tipo mais específico.

Alguns exemplos:

let vAny: any = 10;          // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny;     // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.method();     // ok anything goes with any
vUnknown.method(); // not ok, we don't know anything about this variable

O uso sugerido é:

Muitas vezes, queremos descrever o tipo menos capaz no TypeScript. Isso é útil para APIs que desejam sinalizar "isso pode ter qualquer valor, portanto você deve executar algum tipo de verificação antes de usá-la". Isso força os usuários a examinar com segurança os valores retornados.


35
Qualquer um que venha de background em C # anyé dynamice unknowné como object. Eu gosto unknown, pois é apenas mais seguro para o tipo. Nomes confusos.
Nawfal 12/03/19

1
Eu não sei se é justo comparar unknowne object@nawfal, embora eu acho que vejo o que você está obtendo em termos de contravariância e covariância (por exemplo, qualquer objeto pode ser atribuído ao tipo, objectembora unknownpossa ser atribuído um objeto ou primitivo) - da mesma forma unknownpode ser atribuído a anyou a si próprio e objectpode ser atribuído a dynamicou a si próprio). Em uma nota lateral eu estou claro por que os docs TS referem-se a unknowncomo um tipo de topo, porque ele realmente não conter todos os tipos _ (ツ) _ / ¯
Jordan

38

A diferença entre desconhecido e qualquer é descrita como:

Muito parecido any, qualquer valor é atribuível a unknown; no entanto, ao contrário any, você não pode acessar nenhuma propriedade em valores com o tipo unknown, nem pode chamá-los / construí-los. Além disso, valores do tipo unknownsó podem ser atribuídos a unknownou any.

Para responder à sua pergunta de quando você deve usar unknownmais any:

Isso é útil para APIs que desejam sinalizar "isso pode ter qualquer valor, portanto você deve executar algum tipo de verificação antes de usá-la". Isso força os usuários a examinar com segurança os valores retornados.

Dê uma olhada no anúncio do TypeScript 3.0 para exemplos de verificação de tipo de uma variável do tipo unknowne uma explicação mais detalhada.


21

any tipo:

O anytipo representa todos os valores possíveis de JS. Todo tipo é atribuível ao tipo any. Portanto, o tipo anyé um supertipo universal do sistema de tipos. O compilador TS permitirá qualquer operação nos valores digitados any. Por exemplo:

let myVar: any;

myVar[0];
myVar();
myVar.length;
new myVar();

Em muitas ocasiões, isso é muito tolerante com o compilador TS. isto é, permitirá operações que poderíamos saber estar resultando em um erro de tempo de execução.

unknown tipo:

O unknowntipo representa (exatamente como any) todos os valores possíveis de JS. Todo tipo é atribuível ao tipo unknown. Portanto, o tipo unknowné outro supertipo universal do sistema de tipos (ao lado any). No entanto, o compilador TS não permitirá nenhuma operação nos valores digitados unknown. Além disso, o unknowntipo é apenas atribuível ao tipo any. Um exemplo esclarecerá isso:

let myVar: unknown;

let myVar1: unknown = myVar;   // No error
let myVar2: any = myVar;       // No error
let myVar3: boolean = myVar;   // Type 'unknown' is not assignable to type 'boolean'

// The following operations on myVar all give the error:
// Object is of type 'unknown'
myVar[0];
myVar();
myVar.length;
new myVar();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.