Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用其他类型的属性名称创建有区别的并集_Typescript - Fatal编程技术网

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'.