Alle Felder in JavaScript (und in TypeScript) können den Wert null
oder haben undefined
.
Sie können das Feld optional machen, das sich von nullable unterscheidet.
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;
}
Vergleichen mit:
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
jetzt.)"strict" : false
salary:number|null;
Wenn Sie dies tun,salary?:number; salary = null;
wird eine Fehlermeldung angezeigt. Funktioniert jedochsalary = undefined;
in diesem Fall einwandfrei. Lösung: Verwenden Sie Union, dh '|'Unionstyp ist meiner Meinung nach die beste Option in diesem Fall:
EDIT: Damit dies funktioniert wie erwartet, sollten Sie die Freigabe
strictNullChecks
intsconfig
.quelle
Um C # ähnlicher zu sein, definieren Sie den
Nullable
Typ folgendermaßen:Bonus:
Um
Nullable
sich wie ein integrierter Typescript-Typ zu verhalten, definieren Sie ihn in einerglobal.d.ts
Definitionsdatei im Stammquellordner. Dieser Weg hat bei mir funktioniert:/src/global.d.ts
quelle
emp: Partial<Employee>
, können wiremp.id
oder so,emp.name
aber wenn wir habenemp: Nullable<Employee>
, können wir nichtemp.id
Fügen Sie
?
dem optionalen Feld einfach ein Fragezeichen hinzu .quelle
Sie können einfach einen benutzerdefinierten Typ wie den folgenden implementieren:
quelle
quelle
Ich hatte vor einiger Zeit die gleiche Frage. Alle Typen in ts sind nullbar, weil void ein Subtyp aller Typen ist (im Gegensatz zu zum Beispiel Scala).
Überprüfen Sie, ob dieses Flussdiagramm hilfreich ist - https://github.com/bcherny/language-types-comparison#typescript
quelle
void
‚Subtyp aller Art‘ (die Bodenart ), beziehen sich auf diesen Thread . Auch das Diagramm, das Sie für Scala bereitgestellt haben, ist falsch.Nothing
in scala ist in der Tat der unterste Typ. Typescript, atm, hat keinen unteren Typ, während Scala dies tut .Ein nullbarer Typ kann einen Laufzeitfehler auslösen. Ich denke, es ist gut, eine Compiler-Option zu verwenden
--strictNullChecks
undnumber | null
als Typ zu deklarieren . Auch im Fall einer verschachtelten Funktion kann der Compiler nicht wissen, was er!
beschädigen könnte, obwohl der Eingabetyp null ist. Daher empfehle ich die Verwendung (Ausrufezeichen).Referenz. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-type-assertions
quelle