繁体   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