2つの文字列値のセットがあり、それらを定数オブジェクトとして1つからもう1つにマップします。そのマッピングから、キー用と値用の2つのタイプを生成したいと思います。
const KeyToVal = {
MyKey1: 'myValue1',
MyKey2: 'myValue2',
};
キーは十分に簡単です:
type Keys = keyof typeof KeyToVal;
値のコンパイル時タイプを取得するのに問題があります。これらのうちの1つがうまくいくと思いました:
type Values = typeof KeyToVal[Keys];
type Values<K> = K extends Keys ? (typeof KeyToVal)[K] : never;
type Prefix<
K extends Keys = Keys,
U extends { [name: string]: K } = { [name: string]: K }
> = {[V in keyof U]: V}[K];
これらすべてがValues
をstring
にしました。 typescriptのルックアップを使用して型付きのmapValuesを推論する方法 にも2つの回答を適応させましたが、適応が間違っているか、回答が最初のシナリオに適合しませんでした。
オブジェクト(キー/値の数はいくつでもかまいません)からタイプを推測しようとしています。最初にタイプ(またはおそらくより優れたインターフェース)を記述してから、次のようにキースと値を推測することができます。
type KeyToObjMap = {
some: "other",
more: "somemore",
};
type Keys = keyof KeyToObjMap;
type Values = KeyToObjMap[Keys];
let one: Values = "some";
let two: Values = "other";
let three: Keys = "some";
let four: Values = "somemore";
let five: Keys = "fun";
そして、IDEで正しいハイライトが表示されます。