TypeScript中的可选参数是否可以为null?

TypeScript中的可选参数是否可以为null?,typescript,undefined,optional,nullable,Typescript,Undefined,Optional,Nullable,根据,当在TypeScript中启用严格的null检查时,您不能将null或undefined分配给变量,除非它与union一起被明确允许 //所需值 let-req:字符串; req=“某物”//好啊 req=null;//错误 req=未定义;//错误 //可空值 设nbl:string | null; nbl=“某物”//好啊 nbl=null;//好啊 nbl=未定义;//错误 但是TypeScript中的可选值是否允许null //可选值 让我们选择?:字符串;//(实际上是无效的,

根据,当在TypeScript中启用严格的null检查时,您不能将
null
undefined
分配给变量,除非它与union一起被明确允许

//所需值
let-req:字符串;
req=“某物”//好啊
req=null;//错误
req=未定义;//错误
//可空值
设nbl:string | null;
nbl=“某物”//好啊
nbl=null;//好啊
nbl=未定义;//错误
但是TypeScript中的可选值是否允许
null

//可选值
让我们选择?:字符串;//(实际上是无效的,因为可选类型不能用于变量声明,但这不是重点,所以假设我们正在处理函数参数或其他东西)
opt=“某物”//好啊
opt=null;//好啊错误?
opt=未定义;//好啊
或者是

opt?:字符串;
相当于

opt:string |未定义;

因此不允许像?

let d?:string建议的那样使用
null
将类型声明为
string | undefined


这是因为
undefined
是JS变量的默认值。

编辑:重要注意事项正如昆汀C在下面的评论中指出的那样,这里列出的行为只有在启用严格空值检查时才会出现:
“strictNullChecks”:true
tsconfig.json


类型
null
undefined
作为单独的类型处理。可选类型是特殊的,也允许在函数调用中省略参数

1。如果没有联合或可选,则除了类型本身之外,不允许任何内容。

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
函数foo(条:字符串){
控制台信息(条);
}
福(“你好,世界!”);//好啊
foo(空);//错误
foo(未定义);//错误
foo()//错误
2。要另外允许
null
,可以与
null
建立联合。

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
函数foo(条:字符串| null){
控制台信息(条);
}
福(“你好,世界!”);//好啊
foo(空);//好啊
foo(未定义);//错误
foo()//错误
3。允许
未定义
的工作原理类似。请注意,参数不能省略或
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 | undefined) {
    console.info(bar);
}

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
函数foo(条:字符串| null |未定义){
控制台信息(条);
}
福(“你好,世界!”);//好啊
foo(空);//好啊
foo(未定义);//好啊
foo()//错误
5。使用optional,您可以省略参数,或者传递
未定义的
,但不能传递
null

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
函数foo(条形?:字符串){ 控制台信息(条); } 福(“你好,世界!”);//好啊 foo(空);//错误 foo(未定义);//好啊 foo()//好的 6。要允许所有三种特殊情况,可以将可选和
null
组合使用。

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

foo("Hello World!"); // OK
foo(null); // Error
foo(undefined); // OK
foo() // Error
函数foo(bar?:字符串| null){
控制台信息(条);
}
福(“你好,世界!”);//好啊
foo(空);//好啊
foo(未定义);//好啊
foo()//好的

另外,optional仅在参数或其他类型声明(如接口)中可用,而不在正则变量上可用。因为赋值时省略变量的值是没有意义的

因此,

let d?:字符串;

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

对于像我这样没有正确阅读问题的人,这里列出的行为仅在启用严格的空检查时出现。“strictNullChecks”:在tsconfig.json中为true如果您不正确,
let d?:字符串在TypeScript中无效。看见