2013-06-20 9 views
83

私はTypeScriptにインターフェイスを持っています。TypeScriptで型をnullableとして宣言するにはどうすればいいですか?

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

私は(我々はC#で行うことができますように)NULL可能フィールドとして「給与」をしたいと思います。これはTypeScriptで可能ですか?

+0

'給与?:数;いいえ、それは本当ではない' –

+2

。 –

+3

"給料は?:番号;"間違っている、つまり、給料はオプションでC#のようなものではないことを意味するNullable – squadwuschel

答えて

133

のJavaScript(および活字体で)のすべてのフィールドが値nullまたはundefinedを持つことができます。

フィールドは、オプションでとすることができます。これは、nullableとは異なります。

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; 
} 

は、と比較する:私はしばらく前にこの同じ質問があった

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

[厳密にnullable型と厳密なヌルチェック](https://github.com/Microsoft/TypeScript/pull/7140)が実装されており、Typescript 2.0で到着します! (今は 'typescript @ next') –

25

オプションフィールドに疑問符?を追加するだけです。

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

Ryanが指摘したように...? typescriptではオプションであり、nullではありません。 なし? varがnullまたはundefinedを含む値に設定されなければならないことを意味します。 ?あなたは宣言全体をスキップすることができます。 –

5

ボイドは、すべてのタイプのサブタイプがあるので.. TS内のすべての種類は、NULL可能です(とは異なり、例えば、スカラ) 。

このフローチャートができますかどうかを確認 - https://github.com/bcherny/language-types-comparison#typescript

+1

-1:これはまったく真実ではありません。 「すべてのタイプのサブタイプ」([ボトムタイプ](https://en.wikipedia.org/wiki/Bottom_type))である「void」については、[this thread](https://github.com/Microsoft/TypeScript/issues/3076)。また、あなたがスカラーのために提供したチャートも間違っています。スカラの「何もない」というのは、実際にはボトムタイプです。 Typescript、atm、**はボトムタイプではありません**はスカラ**です**。 –

+0

"すべてのタイプのサブタイプ"!=ボトムタイプ。 TS仕様を参照してくださいhttps://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#327-theundundined-type – bcherny

29

ユニオンタイプは、この場合、私の心の最良の選択肢である:

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

--strictNullChecksを使用する場合(これは必須です)、これはaです。有効なソリューション。オプションのメンバのためには使用しません。なぜなら、すべてのリテラルオブジェクトに明示的なnullを追加する必要があるからです。しかし、関数の戻り値については、それは方法です。 – geon

関連する問題