2

我目前正在将大型 TypeScript 代码库转换为严格的空检查。代码库有许多带有可选成员的类型:

interface MyInterface {
  member1?: number;
  member2?: string;
}

此外,它使用 type 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

null我喜欢 TypeScript 中严格的 null 检查,但我没有用和之间的区别undefined。我可以理解在某些用例中区分null和是有意义的undefined,但在这个项目中,它实际上并没有发挥重要作用。这些函数return null什么都不返回——不管是null还是undefined. 可选成员也是如此——它们要么设置为一个值,要么不设置。

我也更喜欢不转换member1?: number;to member1: Nullable<number>;,而是保持return null原样

我可以至少在 TypeScript 中禁用undefinedand之间的区别吗?null

4

1 回答 1

1

我最好写一条评论,但因为我想向您展示一些代码示例,所以我将其作为答案。

如果我是你,我会为所有带有可选(弱)属性的接口添加一些包装器。

这是此类包装器的示例:


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不是类型的最佳名称,但仍优于FooorBar

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

更新

看起来您的代码在 TS 操场上可以正常工作。请看这里

我已禁用strictNullChecks. 没有错误。

您应该明确设置函数的返回类型。

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

TS版本:4.0.2

于 2020-09-15T19:51:01.173 回答