468 Stimmen

Wie deklariere ich einen Typ als nullable in TypeScript?

Ich habe eine Schnittstelle in TypeScript.

interface Employee{
    id: number;
    name: string;
    salary: number | null;
}

Ich möchte das salary als ein optionales Feld machen (Wie wir es in C# machen können). Ist das in TypeScript möglich?

423voto

Ryan Cavanaugh Punkte 204278

Alle Felder in JavaScript (und in TypeScript) können den Wert null oder undefined haben.

Sie können das Feld optional machen, was sich von nullable unterscheidet.

interface Employee1 {
    name: string;
    salary: number;
}

var a: Employee1 = { name: 'Bob', salary: 40000 }; // OK
var b: Employee1 = { name: 'Bob' }; // Nicht OK, Sie müssen 'salary' haben
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;
}

// Nicht OK: Muss 'salary' haben
class SomeEmployeeB implements Employee1 {
    public name: string;
}

Vergleichen Sie 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' }; // Nicht OK, Gehalt muss eine Nummer sein

// OK, ergibt aber nicht wirklich Sinn
class SomeEmployeeA implements Employee2 {
    public name = 'Bob';
}

322voto

Tim Santeford Punkte 25563

Um mehr wie C# zu sein, definieren Sie den Nullable Typ so:

type Nullable = T | null;

interface Employee{
   id: number;
   name: string;
   salary: Nullable;
}

Bonus:

Um Nullable so zu machen, dass es sich wie ein eingebauter Typescript-Typ verhält, definieren Sie es in einer global.d.ts Definitionsdatei im Stammquellordner. Dieser Pfad hat bei mir funktioniert: /src/global.d.ts

248voto

bjaksic Punkte 2993

Union-Typ ist meiner Meinung nach die beste Option in diesem Fall:

interface Employee{
   id: number;
   name: string;
   salary: number | null;
}

// Beide Fälle sind gültig
let employe1: Employee = { id: 1, name: 'John', salary: 100 };
let employe2: Employee = { id: 1, name: 'John', salary: null };

BEARBEITEN: Damit dies wie erwartet funktioniert, sollten Sie strictNullChecks in tsconfig aktivieren.

70voto

Miguel Ventura Punkte 9926

Füge einfach ein Fragezeichen ? zum optionalen Feld hinzu.

interface Mitarbeiter{
   id: number;
   name: string;
   gehalt?: number;
}

34voto

Willem van der Veen Punkte 26043

Sie können einfach einen benutzerdefinierten Typ wie den folgenden implementieren:

type Nullable = T | undefined | null;

var foo: Nullable = 10; // ok
var bar: Nullable = true; // Der Typ "true" ist nicht vom Typ "Nullable" zuweisbar
var baz: Nullable = null; // ok

var arr1: Nullable> = [1,2]; // ok
var obj: Nullable = {}; // ok

 // Der Typ 'number[]' ist nicht vom Typ 'string[]' zuweisbar. 
 // Der Typ 'number' ist nicht vom Typ 'string' zuweisbar
var arr2: Nullable> = [1,2];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X