gpt4 book ai didi

typescript - 将 TypeScript 接口(interface)的可选属性转换为可为 null 的属性

转载 作者:行者123 更新时间:2023-12-02 03:08:38 25 4
gpt4 key购买 nike

我有以下类型:

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因为父类(super class)型不扩展 undefined ,情况正好相反。所以你最终会得到这种类型:

type B = {
p1: string;
p2: string;
}

您可以创建一个 UndefinedToNull类型,这会导致 distributive conditional type应用,如Tnaked type parameter现在。

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

Playground

关于typescript - 将 TypeScript 接口(interface)的可选属性转换为可为 null 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58318161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com