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

and*_*ero 37 nullable undefined optional typescript

根据这篇文章,当在 TypeScript 中启用严格的空值检查时,除非联合明确允许,否则您不能分配null或分配undefined给变量。

// 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
Run Code Online (Sandbox Code Playgroud)

但是在 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
Run Code Online (Sandbox Code Playgroud)

或者是

opt?: string;
Run Code Online (Sandbox Code Playgroud)

相当于

opt: string | undefined;
Run Code Online (Sandbox Code Playgroud)

因此不允许null就像微软的编码指南推荐的那样?

and*_*ero 58

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


类型nullundefined作为单独的类型处理。在可选类型是特殊的,也是允许的函数调用被排除在外的论点。

1. 没有联合或可选,除了类型本身之外什么都不允许。

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // Error
foo() // Error
Run Code Online (Sandbox Code Playgroud)

2. 为了额外允许nullnull可以进行联合。

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

foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // Error
foo() // Error
Run Code Online (Sandbox Code Playgroud)

3. 允许undefined工作类似。请注意,不能省略该参数或null

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
Run Code Online (Sandbox Code Playgroud)

4. 你也可以允许两者,但必须仍然给出参数。

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
Run Code Online (Sandbox Code Playgroud)

5. 使用optional你可以省略参数,或者通过undefined,但不null

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

foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // OK
foo() // Error
Run Code Online (Sandbox Code Playgroud)

6. 允许所有三种特殊情况,可选null可以组合。

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // OK
Run Code Online (Sandbox Code Playgroud)

此外,optional仅可用于参数或其他类型声明,例如接口,而不可用于常规变量。因为在赋值时忽略变量的值是没有意义的。

因此,

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

foo("Hello World!"); // OK
foo(null); // OK
foo(undefined); // OK
foo() // OK
Run Code Online (Sandbox Code Playgroud)

将毫无意义并导致编译错误。

  • 对于像我这样没有正确阅读问题的人,这里列出的行为仅在启用严格的空检查时才会出现。“strictNullChecks”:tsconfig.json 中为 true (8认同)