gpt4 book ai didi

Typescript 合并从联合类型创建的映射类型

转载 作者:行者123 更新时间:2023-12-04 01:41:13 26 4
gpt4 key购买 nike

我正在尝试从键的联合类型创建映射类型。为了有一个最小的例子,类型简单地映射到它们自己。以下泛型返回预期结果

type Foo<Bar extends string> = {[name in Bar]: name}
type test = Foo<'test1' | 'test2'> //test = {test1: 'test1', test2: 'test2'}

但是,我想删除字符串约束,如果 Bar 不是字符串,则返回 undefined。我通过以下方式做到了这一点

type Foo<Bar> = Bar extends string ? {[name in Bar]: name} : undefined
type test = Foo<'test1' | 'test2'>
//expected result: test = {test1: 'test1', test2: 'test2'}
//actual result: test = {test1: 'test1'} | {test2: 'test2'}

test 现在是联合类型,而不是简单的映射类型。

这是 typescript 中的预期行为还是我应该提交错误报告?有什么方法可以获得我想要的行为吗?

附言如果有帮助,我正在尝试修复 this行。

最佳答案

是的,这是预期的行为,它通常是有用的功能,称为 distributive conditional types .

但有时,就像在您的示例中一样,它会妨碍您。解决方法是将 Bar 类型参数包装在 [] when it's used in condition test 中:

type Foo1<Bar extends string> = {[name in Bar]: name}
type test1 = Foo1<'test1' | 'test2'> //test1 = {test1: 'test1', test2: 'test2'}

type Foo2<Bar> = [Bar] extends [string] ? {[name in Bar]: name} : undefined;
type test2 = Foo2<'test1' | 'test2'> //test2 = {test1: 'test1', test2: 'test2'}
type test3 = Foo2<1>; // undefined

关于Typescript 合并从联合类型创建的映射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57334572/

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