TypeScript 中的可选参数可以为 null 吗?

Can an optional parameter be null in TypeScript?

根据 this article,当在 TypeScript 中启用严格的 null 检查时,您不能将 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

但是 null 是否允许在 TypeScript 中的 可选 值中?

// 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 就像 Microsoft's Coding guidelines 推荐的那样?

let d?: string; 将类型声明为 string | undefined.

这是因为undefined是JS变量的默认值

编辑:重要说明 正如 Quentin C 在下面的评论中指出的那样,此处列出的行为仅在启用严格空值检查时才会出现:"strictNullChecks": true in tsconfig.json.


nullundefined 类型作为单独的类型处理。 optional 类型是特殊的,它还允许在函数调用中省略参数。

1.没有 union 或 optional,除了类型本身之外什么都不允许。

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;

没有意义并会导致编译错误。