„nieznany” kontra „dowolny”


190

TypeScript 3.0 wprowadza unknowntyp, zgodnie z ich wiki:

nieznany jest teraz nazwą typu zarezerwowanego, ponieważ jest teraz typem wbudowanym. W zależności od zamierzonego wykorzystania nieznanego możesz całkowicie usunąć deklarację (preferując nowo wprowadzony nieznany typ) lub zmienić jej nazwę na inną.

Jaka jest różnica między unknowni any? Kiedy powinniśmy używać unknownover any?

Odpowiedzi:


233

Więcej na ten temat można przeczytać unknownw ogłoszeniu PR lub RC , ale sedno jest takie:

[..] nieznane, który jest bezpiecznym odpowiednikiem dowolnego typu. Cokolwiek można przypisać do nieznanego, ale nieznane nie może zostać przypisane do niczego poza sobą i jakimkolwiek bez potwierdzenia typu lub zawężenia opartego na przepływie sterowania. Podobnie żadne operacje nie są dozwolone na nieznanym bez uprzedniego potwierdzenia lub zawężenia do bardziej konkretnego typu.

Kilka przykładów:

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

Sugerowane użycie to:

Często zdarza się, że chcemy opisać typ o najmniejszych możliwościach w TypeScript. Jest to przydatne w przypadku interfejsów API, które chcą sygnalizować, że „może to być dowolna wartość, więc przed jej użyciem należy przeprowadzić pewien rodzaj sprawdzenia”. Zmusza to użytkowników do bezpiecznego introspekcji zwracanych wartości.


35
Każdy, kto wywodzi się z C # w tle, anyjest podobny dynamici unknowntaki jest object. Podoba mi się, unknownponieważ jest po prostu bardziej bezpieczny. Jednak mylące nazwy.
nawfal

1
Nie wiem, czy jest to uczciwe do porównania unknowni object@nawfal chociaż myślę, że widzę, do czego zmierzasz w kategoriach kontrawariancji i kowariancji (np. Każdy obiekt można przypisać do typu, objectchociaż dla unknowndowolnego obiektu lub prymitywu można przypisać - podobnie unknownmoże być przypisane do anysiebie lub do siebie i objectmoże być przypisane do dynamicsiebie lub do siebie). Na marginesie, nie jestem pewien, dlaczego dokumentacja TS odnosi się do unknowntopowego typu, ponieważ tak naprawdę nie zawiera wszystkich typów ¯_ (ツ) _ / ¯
Jordan

38

Różnica między nieznanym a dowolnym jest opisana jako:

Podobnie any, każda wartość jest przypisywana unknown; jednak w przeciwieństwie do tego any, nie możesz uzyskać dostępu do żadnych właściwości wartości typu unknown, ani nie możesz ich wywołać / skonstruować. Ponadto wartości typu unknownmożna przypisać tylko do unknownlub any.

Aby odpowiedzieć na pytanie, kiedy należy używać unknownover any:

Jest to przydatne w przypadku interfejsów API, które chcą sygnalizować, że „może to być dowolna wartość, więc przed jej użyciem należy przeprowadzić pewien rodzaj sprawdzenia”. Zmusza to użytkowników do bezpiecznego introspekcji zwracanych wartości.

Zapoznaj się z ogłoszeniem dotyczącym języka TypeScript 3.0, aby zapoznać się z przykładami sprawdzania typu zmiennej typu unknowni bardziej szczegółowym wyjaśnieniem.


21

any rodzaj:

anyTyp reprezentuje wszystkie możliwe wartości JS. Każdy typ można przypisać do typu any. Dlatego typ anyjest uniwersalnym nadtypem systemu typów. Kompilator TS zezwoli na dowolną operację na wpisanych wartościach any. Na przykład:

let myVar: any;

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

W wielu przypadkach jest to zbyt łagodne dla kompilatora TS. tj. pozwoli na operacje, o których mogliśmy wiedzieć, że powodują błąd w czasie wykonywania.

unknown rodzaj:

unknownTyp reprezentuje (jak any) wszystkich możliwych wartości JS. Każdy typ można przypisać do typu unknown. Dlatego typ unknownjest kolejnym uniwersalnym nadtypem systemu czcionek (obok any). Jednak kompilator TS nie zezwoli na żadną operację na wpisanych wartościach unknown. Ponadto unknowntyp można przypisać tylko do typu any. Przykład to wyjaśni:

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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.