[英]Can an optional parameter be null in 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
但是在 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
。
类型null
和undefined
作为单独的类型处理。 可选类型是特殊的,还允许在函数调用中省略参数。
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. 为了允许所有三种特殊情况,可以组合optional和null
。
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.