我可以在 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 中的严格空值检查,但我对 nullundefined 之间的区别毫无用处。我可以理解在某些用例中区分 nullundefined 是有意义的,但在这个项目中,它确实没有发挥重要作用。这些 return null 只是 return 的函数——不管是 null 还是 undefined。可选成员也是如此——它们要么被设置为一个值,要么没有。

我也不想将 member1?: number; 转换为 member1: Nullable<number>;,而让 return null 保持原样

我能否禁用 undefinednull 之间的区别,至少在 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 不是最好的类型名称,但仍优于 FooBar

我同意@jcalz 的观点,我无法想象用其他方式处理 undefined|null 的其他方式

更新

看起来你的代码在 TS playground 中没有错误。请参阅 here

我已禁用 strictNullChecks。没有错误。

您应该明确设置 return 函数类型。

const myFunction = ():null => {
  return null;
}

TS 版本:4.0.2