Typescript 使用其他类型的属性名称创建有区别的并集
我试图创建一个泛型类型,它从一个类型中获取属性名称和属性类型,并使用它们创建一个有区别的联合类型。例如:Typescript 使用其他类型的属性名称创建有区别的并集,typescript,Typescript,我试图创建一个泛型类型,它从一个类型中获取属性名称和属性类型,并使用它们创建一个有区别的联合类型。例如: type FooBar = { foo: string; bar: number; }; 将映射到: type FooBarPair = { key: "foo", value: string } | { key: "bar", value: number } 我的初步尝试是: type Pairs<T> = { [TK
type FooBar = {
foo: string;
bar: number;
};
将映射到:
type FooBarPair = {
key: "foo",
value: string
} | {
key: "bar",
value: number
}
我的初步尝试是:
type Pairs<T> = {
[TKey in keyof T]: {
key: TKey;
value: T[TKey];
};
};
type Pair<T> = Pairs<T>[keyof T];
我认为这可能是typescript中的一个bug,但我想看看是否有其他方法可以实现这一点。是的,有一种方法可以实现这一点。结果是Typescript推断出了所需的类型
`{ key: "foo"; value: string; } | { key: "bar"; value: number; }`
删除中间泛型类型type Pair=Pairs[keyof T]代码>并在每次使用时将其内联展开,如Pairs[keyof FooBar]
:
type Pairs<T> = {
[TKey in keyof T]: {
key: TKey;
value: T[TKey];
};
};
type FooBar = {
foo: string;
bar: number;
};
let pair: Pairs<FooBar>[keyof FooBar] = {
key: "foo",
value: 3
};
我不确定在这两种情况下推断的“正确”类型是什么,但引入速记类型,如Pair=Pairs[keyof T]
不应影响我的类型推断。这似乎是一个错误。谢谢,我同意这似乎是一个错误,我将提出一个关于typescript的问题。
`{ key: "foo"; value: string; } | { key: "bar"; value: number; }`
type Pairs<T> = {
[TKey in keyof T]: {
key: TKey;
value: T[TKey];
};
};
type FooBar = {
foo: string;
bar: number;
};
let pair: Pairs<FooBar>[keyof FooBar] = {
key: "foo",
value: 3
};
Type '{ key: "foo"; value: number; }' is not assignable to type '{ key: "foo"; value: string; } | { key: "bar"; value: number; }'.
Type '{ key: "foo"; value: number; }' is not assignable to type '{ key: "foo"; value: string; }'.
Types of property 'value' are incompatible.
Type 'number' is not assignable to type 'string'.