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。
类型null和undefined作为单独的类型处理。在可选类型是特殊的,也是允许的函数调用被排除在外的论点。
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. 为了额外允许null,null可以进行联合。
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)
将毫无意义并导致编译错误。
| 归档时间: |
|
| 查看次数: |
21748 次 |
| 最近记录: |