问题描述
我目前正在将大型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
只会返回任何内容的函数-不管是null
还是undefined
都不重要。可选成员也一样-它们要么设置为值,要么不设置。
我也更喜欢不将member1?: number;
转换为member1: Nullable<number>;
,而将return null
保留原样
至少在TypeScript中,我可以禁用undefined
和null
之间的区别吗?
解决方法
我最好写评论,但由于我想向您展示一些代码示例,所以我将其保留为答案。
如果我是你,我会为所有带有可选(弱)属性的接口添加包装器。
以下是此类包装的示例:
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
遍历所有属性。如果property是可选的,则仅使用另一种类型null
扩展此属性,如果property不是可选的,则将其保留不变。
我知道这不是最佳解决方案,但至少它可以帮助您进行迁移。
迁移之后,您可以使类型更健壮并摆脱MapNullable
界面。
MapNullable
并不是最佳的类型名称,但仍然优于Foo
或Bar
我同意@jcalz,我无法想象以其他方式处理undefined | null的其他方式
更新
看起来您的代码在TS游乐场中正常运行。请参阅here
我已禁用strictNullChecks
。没有错误。
您应该显式设置函数的返回类型。
const myFunction = ():null => {
return null;
}
TS版本:4.0.2