Wszystkie pola w JavaScript (i w TypeScript) mogą mieć wartość null
lub undefined
.
Możesz ustawić pole opcjonalne, które różni się od zerowalnego.
interface Employee1 {
name: string;
salary: number;
}
var a: Employee1 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee1 = { name: 'Bob' }; // Not OK, you must have 'salary'
var c: Employee1 = { name: 'Bob', salary: undefined }; // OK
var d: Employee1 = { name: null, salary: undefined }; // OK
// OK
class SomeEmployeeA implements Employee1 {
public name = 'Bob';
public salary = 40000;
}
// Not OK: Must have 'salary'
class SomeEmployeeB implements Employee1 {
public name: string;
}
Porównać z:
interface Employee2 {
name: string;
salary?: number;
}
var a: Employee2 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee2 = { name: 'Bob' }; // OK
var c: Employee2 = { name: 'Bob', salary: undefined }; // OK
var d: Employee2 = { name: null, salary: 'bob' }; // Not OK, salary must be a number
// OK, but doesn't make too much sense
class SomeEmployeeA implements Employee2 {
public name = 'Bob';
}
typescript@next
teraz.)"strict" : false
salary:number|null;
Jeśli to zrobisz,salary?:number; salary = null;
pojawi się błąd. Jednaksalary = undefined;
w tym przypadku będzie działać dobrze. Rozwiązanie: użyj Unii, tj. „|”Moim zdaniem typ Unii jest najlepszą opcją w tym przypadku:
EDIT: Do tego, aby działać zgodnie z oczekiwaniami, należy włączyć
strictNullChecks
wtsconfig
.źródło
Aby być bardziej podobnym do C # , zdefiniuj
Nullable
typ w ten sposób:Premia:
Aby
Nullable
zachować się jak wbudowany typ maszynopisu, zdefiniuj go wglobal.d.ts
pliku definicji w głównym folderze źródłowym. Ta ścieżka działała dla mnie:/src/global.d.ts
źródło
emp: Partial<Employee>
, możemy zrobićemp.id
lubemp.name
etc, ale jeśli mamyemp: Nullable<Employee>
, nie możemy zrobićemp.id
Wystarczy dodać znak zapytania
?
w polu opcjonalnym.źródło
Możesz po prostu zaimplementować typ zdefiniowany przez użytkownika, taki jak poniżej:
źródło
źródło
miałem to samo pytanie jakiś czas temu… wszystkie typy w ts są zerowalne, ponieważ void jest podtypem wszystkich typów (w przeciwieństwie do, na przykład, scala).
sprawdź, czy ten schemat blokowy pomaga - https://github.com/bcherny/language-types-comparison#typescript
źródło
void
bycie „podtypem wszystkich typów” ( typ dolny ), zapoznaj się z tym wątkiem . Również wykres, który podałeś dla Scali, jest również niepoprawny.Nothing
w scala jest w rzeczywistości typem dna. Typescript, atm, nie ma typu bottom, podczas gdy scala ma .Typ zerowy może wywoływać błąd czasu wykonywania. Myślę więc, że dobrze jest użyć opcji kompilatora
--strictNullChecks
i zadeklarowaćnumber | null
jako typ. także w przypadku funkcji zagnieżdżonej, chociaż typ danych wejściowych ma wartość NULL, kompilator nie może wiedzieć, co mogłoby się zepsuć, dlatego zalecam użycie!
(wykrzyknik).Odniesienie. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions
źródło