TypeScript 中的可选参数可以为 null 吗?
Can an optional parameter be null in TypeScript?
根据 this article,当在 TypeScript 中启用严格的 null 检查时,您不能将 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
但是 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
.
null
和 undefined
类型作为单独的类型处理。 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.为了允许所有三种特殊情况,可以组合 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;
没有意义并会导致编译错误。
根据 this article,当在 TypeScript 中启用严格的 null 检查时,您不能将 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
但是 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
.
null
和 undefined
类型作为单独的类型处理。 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.为了允许所有三种特殊情况,可以组合 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;
没有意义并会导致编译错误。