2013-06-20 13 views
83

Mam interfejs w TypeScript.Jak zadeklarować typ zerowy w TypeScript?

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

Chciałbym uczynić "wynagrodzenie" jako pole zerowe (jak możemy zrobić w języku C#). Czy można to zrobić w TypeScript?

+0

'pensja ?: numer;' –

+2

Nie, to nie prawda. –

+3

"wynagrodzenie?: Numer;" jest źle, to znaczy, że wynagrodzenie jest opcjonalne, a nie jak w C# Nullable – squadwuschel

Odpowiedz

133

wszystkie pola w JavaScript (oraz w maszynopisie) może mieć wartość null lub undefined.

Możesz ustawić pole opcjonalnie, które różni się od zerowania.

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ównaj 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'; 
} 
+9

Wygląda na to, że [typy ściśle zerowe i ścisłe kontrole null] (https://github.com/Microsoft/TypeScript/pull/7140) zostały zaimplementowane i pojawią się wraz z Typescript 2.0! (lub "maszynopis @ następny" teraz.) –

25

Po prostu dodaj znak zapytania ? do opcjonalnego pola.

interface Employee{ 
    id: number; 
    name: string; 
    salary?: number; 
} 
+21

Jak Ryan zwrócił uwagę ...? oznacza opcjonalny w maszynopisie, a nie null. Bez? oznacza, że ​​var musi być ustawiony na wartość, w tym null lub undefined. Z? możesz pominąć całą deklarację. –

5

miałem to samo pytanie jakiś czas temu .. Wszystkie rodzaje w ts są pustych, bo nieważne jest podtypem wszystkich typów (w przeciwieństwie, na przykład, Scala) .

zobaczyć, czy ten schemat blokowy pomaga - https://github.com/bcherny/language-types-comparison#typescript

+1

-1: To wcale nie jest prawdą. Jeśli chodzi o 'void' będący 'podtypem wszystkich typów' ([typ u dołu] (https://en.wikipedia.org/wiki/Bottom_type)), przeczytaj [ten wątek] (https://github.com/Microsoft/TypeScript/issues/3076). Również wykres podany dla scala jest również niepoprawny. "Nic" w scala jest w rzeczywistości typem dolnym. Maszynopis, atm, ** nie ** mają typu bottom, podczas gdy scala ** robi **. –

+0

"Podtyp wszystkich typów"! = Typ dolny. Zobacz specyfikację TS tutaj https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#327-the-undefined-type – bcherny

29

typ Unia jest w moim umyśle najlepszym rozwiązaniem w tym przypadku:

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

// Both cases are valid 
let employe1: Employee = { id: 1, name: 'John', salary: 100 }; 
let employe2: Employee = { id: 1, name: 'John', salary: null }; 
+1

Jeśli używasz --strictNullChecks (co powinieneś), jest to prawidłowe rozwiązanie. Nie użyłbym go na rzecz elementów opcjonalnych, ponieważ zmusza cię to do dodania jawnej wartości null do wszystkich obiektów literackich, ale w przypadku wartości zwracanych przez funkcję jest to droga do zrobienia. – geon

Powiązane problemy