したがって、typecriptで見つかった秘訣は、タイプをキーと値のペアにマッピングしてから、keyof
タイプを使用してマップ内の任意の値にすることによって、オブジェクトタイプを識別されたユニオンに変換することです。ここでは簡単な例です:ハードコーディングされたタイプとは異なるセマンティクスを持つジェネリックの[typof T]の理由は?
type SourceType =
{
foo: number,
bar: string
};
type MapWithKey<T> = {[P in keyof T]: { key: P, value: T[P] }}
type DescriminatedUnion = MapWithKey<SourceType>[keyof SourceType];
//The DescriminatedUnion now has the following type
DescriminatedUnion ≡ {key:"foo",value:string} | {key:"bar",value:number}
あなたはあなたが別のタイプで終わるこの構築物は、完全に汎用的にするためにしようとすると、しかし、非常に大きな判別組合を指定したい場合、これは非常に便利です。
type MakeDescriminatedUnion<T> = MapWithKey<T>[keyof T];
type DescriminatedUnion = MakeDescriminatedUnion<SourceType>
//The DescriminatedUnion now has the followin type
DescriminatedUnion ≡ {key:"foo"|"bar",value:number|string}
これは同じタイプである必要がありますが、何らかの理由でそうではありません。私はtypescriptのドキュメントを見て、この動作の理由を見つけようとしましたが、私はできません。この違いの背後にある理由を知っている人はいますか?それとも、誰かがこの振る舞いを回避して完全に汎用化する方法を知っていますか?
[この質問](https://stackoverflow.com/questions/43898999/creating-a-discriminated-union-using-the-property-names-of-another-type)は非常によく似ています、ここでは[github問題](https://github.com/Microsoft/TypeScript/issues/15756)、[こちらの修正プログラム](https://github.com/Microsoft/TypeScript/pull/18042) – artem
ありがとうございました!それは私の予想以上のものです。 @artem –