gpt4 book ai didi

具有多个条件的 Typescript 条件映射类型

转载 作者:行者123 更新时间:2023-12-02 20:01:17 25 4
gpt4 key购买 nike

我正在 redux 存储中处理规范化数据(所有复杂类型只是引用真实对象的 id),并且我想使用 typescript 的条件映射类型功能创建非规范化类型。

我保留 id 所引用的对象的实际类型,因为它是通用参数,并且如果仅使用非数组 id 属性,我就能够正确创建非规范化类型。

type Id<T extends HandlerBase<any>> = string & { __type: T };

class HandlerBase<T extends HandlerBase<T>> {};

class HandlerA extends HandlerBase<HandlerA> {
str: string;
b: Id<HandlerB>;
bArr: Id<HandlerB>[];
};

class HandlerB extends HandlerBase<HandlerA> {};

type DenormalizedHandler<T> = {
[P in keyof T]: T[P] extends Id<infer U> ? DenormalizedHandler<U> : T[P];
}

const handler: DenormalizedHandler<HandlerA> = undefined;
handler.str; // Is string
handler.b; // Is DenormalizedHandler<HandlerB>
handler.bArr; // Should be DenormalizedHandler<HandlerB>[]

现在我需要弄清楚如何将第二个条件添加到 DenormalizedHandler这样它就可以正确映射Id<U>DenormalizedHandler<U>Id<U>[]DenormalizedHandler<U>[] .

最佳答案

您只需要添加另一个条件,条件类型可以像三元表达式一样嵌套:

type Id<T extends HandlerBase<any>> = string & { __type: T };

class HandlerBase<T extends HandlerBase<T>> {};

class HandlerA extends HandlerBase<HandlerA> {
str: string;
b: Id<HandlerB>;
bArr: Id<HandlerB>[];
};

class HandlerB extends HandlerBase<HandlerA> {};

type DenormalizedHandler<T> = {
[P in keyof T]:
T[P] extends Id<infer U> ? DenormalizedHandler<U> :
T[P] extends Array<Id<infer U>> ? Array<DenormalizedHandler<U>> :
T[P];
}

const handler: DenormalizedHandler<HandlerA> = undefined;
handler.str; // Is string
handler.b; // Is DenormalizedHandler<HandlerB>
handler.bArr; // Is DenormalizedHandler<HandlerB>[]

关于具有多个条件的 Typescript 条件映射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55812911/

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