gpt4 book ai didi

typescript - 在 TypeScript 中动态提取类型

转载 作者:行者123 更新时间:2023-12-04 08:00:37 25 4
gpt4 key购买 nike

我正在尝试根据某些标志将一种类型动态映射到另一种类型,这可能会导致可选字段。

type Constraint = {
required: boolean,
callback: () => any,
}

type Schema = Record<string, Constraint>;

const mySchema: Schema = {
bar: {
required: true,
callback: () => 1
},
foo: {
required: false,
callback: () => true
}
}

type MapSchemaToOutput<T extends Schema> = {
[K in keyof T as T[K]['required'] extends true ? K : never]: ReturnType<T[K]['callback']>
} & {
[K in keyof T as T[K]['required'] extends false ? K : never]?: ReturnType<T[K]['callback']>
}

type Output = MapSchemaToOutput<typeof mySchema>;
最终目标是使输出相等:
{
bar: number,
foo?: boolean
}
我知道我可以手动进行映射,有兴趣知道这是否可以动态完成。

最佳答案

您的方法按原样进行,只需进行一次更改。
问题在于: Schema注释是“丢弃类型信息”:

const mySchema: Schema = {
//...
};
有了那个注释,TS 只记得 mySchemaRecord<string, Constraint> ,没有任何对象的具体结构。

一种解决方法是 as const :
const mySchema = {
//...
} as const;
这保留了对象内的文字类型。但是,对 mySchema 的内容不再有任何限制。 ,以及定义 mySchema 的任何错误必须被用法捕获,而不是在定义时捕获。

更好的解决方法是使用辅助函数来引入约束,而不直接注释类型:
function buildSchema<T extends Schema>(schema: T) { return schema; }

const mySchema = buildSchema({
//...
});
由于 <T extends Schema>约束,如果架构对象与指定的类型不匹配,TS 将像以前一样引发错误。
但与注释对象的类型不同,此函数返回的此类型与传递给该函数的文字对象没有变化:因此不会丢失任何类型信息。
With this change, the rest of the types work as expected

关于typescript - 在 TypeScript 中动态提取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66496550/

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