typescript - 将 TypeScript 接口的可选属性转换为可为空的属性
问题描述
我有以下类型:
interface A {
p1: string
p2?: string
}
我想生成一个子类型B
,其中可选属性转换为可为空的属性。相当于:
interface B {
p1: string
p2: string | null
}
我试过这样的事情:
type VuexPick<T, K extends keyof T> = {
[P in K]-?: T[P] extends undefined ? null : T[P];
};
type B = VuexPick<A, "p1" | "p2">;
但它不起作用。任何想法?
解决方案
您的类型B
得到解决:
type B = {
p1: string extends undefined ? null : string
p2: string | undefined extends undefined ? null : string | undefined
};
string | undefined
由于超类型不扩展undefined
,因此相反。所以你最终得到了这种类型:
type B = {
p1: string;
p2: string;
}
您可以改为创建一个UndefinedToNull
类型,这会导致应用分布式条件类型,就像T
现在的裸类型参数一样。
type VuexPick2<T, K extends keyof T> = {
[P in K]-?: UndefinedToNull<T[P]>;
};
type UndefinedToNull<T> = T extends undefined ? null : T
type B2 = VuexPick2<A, "p1" | "p2">; // type B2 = { p1: string; p2: string | null;}
例如类型UndefinedToNull<string | undefined>
与B4
:
type B4 =
| (string extends undefined ? null: string)
| (undefined extends undefined ? null: undefined) // type B4 = string | null
推荐阅读
- javascript - 如何从javascript中的3个对象数组中排序并获取最大值并将其分配给另一个数组?
- amazon-web-services - 我无法访问具有公共 IP 的网站
- python - 要求已安装,但是当我尝试运行该程序时它说它没有
- python - groupby 对象到数据框
- html - 导航栏徽标在 CSS 中不起作用,但在 HTML 中起作用
- c - 如何在没有警告的情况下返回正确的数据类型
- r - 如何在数据表中舍入和添加新列?
- html - 如何用 HTML 中的列表交换文本?
- python - KeyError "id" Python:为什么字典中没有键?
- docker - Zeppelin 错误:部署到 Kubernetes 集群后“解释器进程未运行”