我可以在 TypeScript 严格空值检查模式下禁用区分 null 和 undefined 吗?
Can I disable distinguishing between null and undefined in TypeScript strict null-checking mode?
我目前正在将大型 TypeScript 代码库转换为严格的 null 检查。代码库有许多带有可选成员的类型:
interface MyInterface {
member1?: number;
member2?: string;
}
此外,它使用类型Nullable<T> = T | null
,并且有很多return null
语句。
现在我面临许多编译器错误,这些错误基本上表明 T | null
无法转换为 T | undefined
,反之亦然,如本例所示:
interface MyInterface {
member1?: number;
member2?: string;
}
const myFunction = () => {
return null;
}
const item: MyInterface = {};
item.member1 = myFunction(); // <== can't assign null to undefined
我喜欢 TypeScript 中的严格空值检查,但我对 null
和 undefined
之间的区别毫无用处。我可以理解在某些用例中区分 null
和 undefined
是有意义的,但在这个项目中,它确实没有发挥重要作用。这些 return null
只是 return 的函数——不管是 null
还是 undefined
。可选成员也是如此——它们要么被设置为一个值,要么没有。
我也不想将 member1?: number;
转换为 member1: Nullable<number>;
,而让 return null
保持原样
我能否禁用 undefined
和 null
之间的区别,至少在 TypeScript 中如此?
我最好写一条评论,但由于我想向您展示一些代码示例,所以我将其作为答案。
如果我是你,我会为所有具有可选(弱)属性的接口添加一些包装器。
这是此类包装器的示例:
type MapNullable<T> = {
[P in keyof T]: undefined extends T[P] ? (T[P] | null) : T[P]
}
interface MyInterface {
member1?: number;
member2?: string;
}
const myFunction = () => {
return null;
}
const item: MapNullable<MyInterface> = {};
item.member1 = myFunction(); // member1?: number | null | undefined
MapNullable
遍历所有属性。如果 属性 是可选的,它只是用另一种类型扩展这个 属性 - null
,如果 属性 不是可选的,它保持原样。
我知道这不是最好的解决方案,但至少它可以帮助您进行迁移。
迁移后,您可以使类型更健壮并摆脱 MapNullable
接口。
MapNullable
不是最好的类型名称,但仍优于 Foo
或 Bar
我同意@jcalz 的观点,我无法想象用其他方式处理 undefined|null 的其他方式
更新
看起来你的代码在 TS playground 中没有错误。请参阅 here
我已禁用 strictNullChecks
。没有错误。
您应该明确设置 return 函数类型。
const myFunction = ():null => {
return null;
}
TS 版本:4.0.2
我目前正在将大型 TypeScript 代码库转换为严格的 null 检查。代码库有许多带有可选成员的类型:
interface MyInterface {
member1?: number;
member2?: string;
}
此外,它使用类型Nullable<T> = T | null
,并且有很多return null
语句。
现在我面临许多编译器错误,这些错误基本上表明 T | null
无法转换为 T | undefined
,反之亦然,如本例所示:
interface MyInterface {
member1?: number;
member2?: string;
}
const myFunction = () => {
return null;
}
const item: MyInterface = {};
item.member1 = myFunction(); // <== can't assign null to undefined
我喜欢 TypeScript 中的严格空值检查,但我对 null
和 undefined
之间的区别毫无用处。我可以理解在某些用例中区分 null
和 undefined
是有意义的,但在这个项目中,它确实没有发挥重要作用。这些 return null
只是 return 的函数——不管是 null
还是 undefined
。可选成员也是如此——它们要么被设置为一个值,要么没有。
我也不想将 member1?: number;
转换为 member1: Nullable<number>;
,而让 return null
保持原样
我能否禁用 undefined
和 null
之间的区别,至少在 TypeScript 中如此?
我最好写一条评论,但由于我想向您展示一些代码示例,所以我将其作为答案。
如果我是你,我会为所有具有可选(弱)属性的接口添加一些包装器。
这是此类包装器的示例:
type MapNullable<T> = {
[P in keyof T]: undefined extends T[P] ? (T[P] | null) : T[P]
}
interface MyInterface {
member1?: number;
member2?: string;
}
const myFunction = () => {
return null;
}
const item: MapNullable<MyInterface> = {};
item.member1 = myFunction(); // member1?: number | null | undefined
MapNullable
遍历所有属性。如果 属性 是可选的,它只是用另一种类型扩展这个 属性 - null
,如果 属性 不是可选的,它保持原样。
我知道这不是最好的解决方案,但至少它可以帮助您进行迁移。
迁移后,您可以使类型更健壮并摆脱 MapNullable
接口。
MapNullable
不是最好的类型名称,但仍优于 Foo
或 Bar
我同意@jcalz 的观点,我无法想象用其他方式处理 undefined|null 的其他方式
更新
看起来你的代码在 TS playground 中没有错误。请参阅 here
我已禁用 strictNullChecks
。没有错误。
您应该明确设置 return 函数类型。
const myFunction = ():null => {
return null;
}
TS 版本:4.0.2