簡體   English   中英

TypeScript 中的可選參數可以為 null 嗎?

[英]Can an optional parameter be null in TypeScript?

根據 這篇文章,在 TypeScript 中啟用嚴格空值檢查時,除非聯合明確允許,否則不能將nullundefined分配給變量。

// required value
let req: string;
req = "Something";  // OK
req = null;      // Error
req = undefined; // Error

// nullable value
let nbl: string | null;
nbl = "Something";  // OK
nbl = null;      // OK
nbl = undefined; // Error

但是在 TypeScript 的可選值中允許null嗎?

// optional value
let opt?: string; // (actually invalid, as optional types cannot be used for variable declarations, but that's not the point, so imagine we are dealing with function parameters or something)
opt = "Something"; // OK
opt = null; // OK? Error?
opt = undefined; // OK

或者是

opt?: string;

相當於

opt: string | undefined;

因此不允許null就像微軟的編碼指南推薦的那樣?

編輯:重要說明正如 Quentin C 在下面的評論中指出的那樣,此處列出的行為僅在啟用嚴格空檢查時才適用: "strictNullChecks": true in tsconfig.json


類型nullundefined作為單獨的類型處理。 可選類型是特殊的,還允許在函數調用中省略參數。

1. 沒有聯合或可選,除了類型本身之外什么都不允許。

function foo(bar: string) {
    console.info(bar);
}

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // Error
foo() // Error

2. 要額外允許null ,可以與null進行聯合。

function foo(bar: string | null) {
    console.info(bar);
}

foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // Error
foo() // Error

3. 允許undefined工作方式類似。 請注意,該參數不能被遺漏或為null

function foo(bar: string | undefined) {
    console.info(bar);
}

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error

4. 你也可以允許兩者,但必須仍然給出參數。

function foo(bar: string | null | undefined) {
    console.info(bar);
}

foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // OK
foo() // Error

5. 使用optional你可以省略參數,或者傳遞undefined ,但不是null

function foo(bar?: string) {
    console.info(bar);
}

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // OK

6. 為了允許所有三種特殊情況,可以組合optionalnull

function foo(bar?: string | null) {
    console.info(bar);
}

foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // OK
foo() // OK

此外, optional僅可用於參數或其他類型聲明,例如接口,而不可用於常規變量。 因為在賦值時忽略變量的值是沒有意義的。

因此,

let d?: string;

將毫無意義並導致編譯錯誤。

let d?: string; 將類型聲明為string | undefined string | undefined

這是因為undefined是 JS 變量的默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM