gpt4 book ai didi

typescript - TypeScript 条件类型的映射与受约束的泛型不同吗?

转载 作者:行者123 更新时间:2023-12-03 17:17:56 24 4
gpt4 key购买 nike

我无法理解为什么下面的代码会起作用:

type MapOverString<T extends string> = { [K in T]: K };

type IfStringMapOverIt<T> = T extends string ? MapOverString<T> : never;

type ThisWorks = MapOverString<'a'>;
// { a: 'a' }

type ThisAlsoWorks = IfStringMapOverIt<'a'>;
// { a: 'a' }

type Union = 'a' | 'b' | 'c';

type ThisWorksToo = MapOverString<Union>;
// { a: 'a', b: 'b', c: 'c' }

type ThisDoesnt = IfStringMapOverIt<Union>;
// MapOverString<'a'> | MapOverString<'b'> | MapOverString<'c'>
Playground link
我一定是遗漏了什么,因为 MapOverStringIfStringMapOverIt似乎它们的功能应该相同。
最终,我使用字符串文字和泛型来级联配置类型的排列。例如,如果您想要 StringConfig<T>配置了选项 'a' | 'b' | 'c' :
type ConfigMap<T> = T extends number
? NumberConfig
: T extends string
? StringConfig<T>
: never

type MyConfig = ConfigMap<'a' | 'b' | 'c'> // so many sad faces
有人可以启发我吗?这里发生了什么?

最佳答案

这是条件类型分布特性的应用。裸类型参数上的条件将触发此行为和 T extends string满足这个。您可能还会看到 T extend TT extends anyT extends unknown出于这个原因使用,只是为了触发分发。
您可以在 handbook 中阅读有关分配条件类型的更多信息。
您可以通过在元组上使用条件来禁用分发 [T] extends [string] .这样做的效果类似于常规条件,只是因为类型参数不再是裸分布才会显示。

type StringConfig<T extends string> = { [K in T]: K };
type NumberConfig ={}

type ConfigMap<T> = [T] extends [number]
? NumberConfig
: [T] extends [string]
? StringConfig<T>
: never

export type MyConfig = ConfigMap<'a' | 'b' | 'c'> // so many sad faces
let x:MyConfig = {
a:'a',
b:'b',
c: 'c'
}
Playground Link

关于typescript - TypeScript 条件类型的映射与受约束的泛型不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64511868/

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