Czy ktoś zna różnicę między ciągiem a ciągiem w TypeScript? Czy mam rację zakładając, że powinny być takie same?
var a: String = "test";
var b: string = "another test";
a = b;
b = a; // this gives a compiler error!
Obecna wersja kompilatora mówi:
Type 'String' is not assignable to type 'string'.
'string' is a primitive, but 'String' is a wrapper object.
Prefer using 'string' when possible.
Czy to błąd?
typescript
Paul0515
źródło
źródło
Odpowiedzi:
Oto przykład, który pokazuje różnice, które pomogą w wyjaśnieniu.
String
jest typem ciągu znaków JavaScript, którego można użyć do tworzenia nowych ciągów znaków. Nikt tego nie robi, ponieważ w JavaScript literały są uważane za lepsze, więcs2
w powyższym przykładzie tworzy nowy ciąg bez użycianew
słowa kluczowego i bez jawnego użyciaString
obiektu.string
to typ ciągu TypeScript, którego można używać do wpisywania zmiennych, parametrów i zwracanych wartości.Dodatkowe uwagi ...
Obecnie (luty 2013), Obie
s1
is2
obowiązują JavaScript.s3
jest poprawnym TypeScript.Korzystanie z
String
. Prawdopodobnie nigdy nie musisz go używać, literały łańcuchowe są powszechnie akceptowane jako właściwy sposób inicjowania łańcucha. W JavaScript uważa się również, że lepiej używać literałów obiektowych i literałów tablicowych:Jeśli naprawdę masz skłonność do łańcucha, możesz go użyć w TypeScript na jeden z dwóch sposobów ...
źródło
string
rodzaju i dosłownego inicjalizacji:var s: string = "My String";
.var s: string = "My String"
jest identyczny zvar s = "My String"
... również, bez względu na to, ile razy przeczytałem tę odpowiedź, nadal nie rozumiem celu tegostring
typu w TypeScript, ponieważ pod koniec dnia ,('My String')['constructor'] === String
...Te dwa typy są różne w JavaScript i TypeScript - TypeScript po prostu daje nam składnię do adnotacji i sprawdzania typów w miarę postępów.
String
odnosi się do instancji obiektu, która maString.prototype
w swoim łańcuchu prototypów. Można dostać taki przypadek w różny sposób, na przykładnew String('foo')
aObject('foo')
. Możesz przetestować wystąpienieString
typu zinstanceof
operatorem, npmyString instanceof String
.string
jest jednym z prymitywnych typów JavaScript, astring
wartości są tworzone przede wszystkim za pomocą literałów, np.'foo'
i"bar"
, oraz jako wynikowy typ różnych funkcji i operatorów. Możesz sprawdzićstring
typ za pomocątypeof myString === 'string'
.Zdecydowana większość czasu
string
jest typem, którego powinieneś używać - prawie wszystkie interfejsy API, które pobierają lub zwracają ciągi, będą go używać. Wszystkie pierwotne typy JS zostaną zawinięte ( zapakowane w pudełka ) odpowiadającymi im typami obiektów podczas używania ich jako obiektów, np. Dostępu do właściwości lub metod wywoływania. PonieważString
w bibliotece podstawowej TypeScript jest obecnie zadeklarowany jako interfejs, a nie klasa , typowanie strukturalne oznacza, żestring
uważa się, że podtyp tegoString
jest pierwszym powodem, dla którego pierwszy wiersz przechodzi sprawdzanie typu kompilacji.źródło
W JavaScript łańcuchy mogą być zarówno pierwotnymi typami łańcuchów, jak i obiektami łańcuchowymi. Poniższy kod pokazuje to rozróżnienie:
Twój błąd:
Jest generowany przez kompilator TS, ponieważ próbowałeś przypisać typ
string
do typu obiektu łańcuchowego (utworzonego za pomocąnew
słowa kluczowego). Kompilator mówi ci, że powinieneś używać tego typustring
tylko dla pierwotnych typów łańcuchów i nie możesz używać tego typu do opisywania typów obiektów łańcuchowych.źródło
TypeScript:
String
vsstring
próbny
źródło
Dla szybkich czytelników:
Nie zawsze używać typów liczbowych, String , Boolean, symbol lub obiektu typy te odnoszą się do innych niż prymitywnych pudełkowych obiektów, które są prawie nigdy nie stosowane odpowiednio w kodzie JavaScript.
źródło