如何在 TypeScript 中使可为 null 的属性可选?

lar*_*rbo 4 typescript typescript-generics

我有这样的类型:

type City = {
  name: string;
  id: number | null;
};
Run Code Online (Sandbox Code Playgroud)

并想把它变成这样的类型:

type City = {
  name: string;
  id?: number;
};
Run Code Online (Sandbox Code Playgroud)

我已经看到很多帖子解释如何使可选类型可以为空,但我想要相反的东西。

有没有办法创建一个像OptionalNullable<T>这样处理这个问题的 TypeScript 通用函数?

Tob*_* S. 7

这应该可以解决问题:

type PickNullable<T> = {
  [P in keyof T as null extends T[P] ? P : never]: T[P]
}

type PickNotNullable<T> = {
  [P in keyof T as null extends T[P] ? never : P]: T[P]
}

type OptionalNullable<T> = {
  [K in keyof PickNullable<T>]?: Exclude<T[K], null>
} & {
  [K in keyof PickNotNullable<T>]: T[K]
}
Run Code Online (Sandbox Code Playgroud)

我创建了两种实用程序类型,它们分别从类型中选取所有可为空的而非不可为空的属性。我们可以使用它们来构造一个新类型,其中所有可为空的属性都是可选的。我也用Excludeso来摆脱null

它可以这样使用:

type City = {
  name: string;
  id: number | null;
};

type Test = OptionalNullable<City>
// {
//    id?: number | undefined;
// } & {
//     name: string;
// }
Run Code Online (Sandbox Code Playgroud)

操场