2017-05-10 15 views
5

型からプロパティ名とプロパティ型を取り除いて区別された共用体型を作成するジェネリック型を作成しようとしています。例えば:私の最初の試みである別の型のプロパティ名を使用して識別された共用体を作成する

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]; 

が、私は上記のタイプにこれを適用しよう:

let pair: Pair<FooBar> = { 
    key: "foo", 
    value: 3 
}; 

type FooBar = { 
    foo: string; 
    bar: number; 
}; 

はにマッピングされます

私はコンパイルエラーが予想されますが、私は1つはありません。私はPair<FooBar>の種類を検査するとき、私はそれがに相当見つける:

{ 
    key: "foo" | "bar"; 
    value: string | number; 
} 

私は、これはtypescriptですのバグかもしれないと思うが、私はこれを達成するための他の方法があったかどうかを確認したかったです。

答えて

3

はい、これを達成する方法があります。それはあなたが中間のジェネリック型type Pair<T> = Pairs<T>[keyof T];を削除し、Pairs<FooBar>[keyof FooBar]のようなインラインあなたがそれを使用しているだろうたびに、それを展開すると活字体が所望のタイプ

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

どちらの場合でも「正しい」タイプは推測されませんが、のような簡略タイプの導入は型推論IMOに影響しません。バグみたいです

+0

ありがとう、私はバグのように思えます、私はtypescriptで問題を提起します。 –

+0

[問題](https://github.com/Microsoft/TypeScript/issues/15756)が発生しました。 –

+0

[修正プログラムは動作中です](https://github.com/Microsoft/TypeScript/pull/18042) – artem

関連する問題