web-dev-qa-db-ja.com

Typescriptのオブジェクトのキーと値の両方からの型

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

これらすべてがValuesstringにしました。 typescriptのルックアップを使用して型付きのmapValuesを推論する方法 にも2つの回答を適応させましたが、適応が間違っているか、回答が最初のシナリオに適合しませんでした。

13
dx_over_dt

オブジェクト(キー/値の数はいくつでもかまいません)からタイプを推測しようとしています。最初にタイプ(またはおそらくより優れたインターフェース)を記述してから、次のようにキースと値を推測することができます。

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で正しいハイライトが表示されます。

IDE

0
setdvd