活字体:オブジェクトの配列から派生ユニオンタイプ

ベン:

私はアイテムの種類強制配列を宣言し、それから共用体型を導出できるようにしたいと思います。あなたが明示的に配列内の項目にタイプを与えていない場合は、このパターンは動作します。私はないです確か最高にので、ここでそれを説明する方法の例は以下のとおりです。

(実施例1)

type Pair = {
  key: string;
  value: number;
};

const pairs: ReadonlyArray<Pair> = [
  { key: 'foo', value: 1 },
  { key: 'bar', value: 2 },
] as const;

type Keys = typeof pairs[number]['key']

【実施例2

type Data = {
  name: string;
  age: number;
};

const DataRecord: Record<string, Data> = {
  foo: { name: 'Mark', age: 35 },
  bar: { name: 'Jeff', age: 56 },
} as const;

type Keys = keyof typeof DataRecord;

ここで使用した場合、キーを導出する例ですas const私はこれと同じ動作をしたいが、配列を明示的に入力されています。

const pairs = [
  { key: 'foo', value: 1 },
  { key: 'bar', value: 2 },
] as const;

type Keys = typeof pairs[number]['key']; // "foo" | "bar"

キーの値を希望: "foo"|"bar"

キーの実際の値: string

ティツィアーノCernicova-Dragomir:

変数のためには、いずれかの初期設定からタイプ推測コンパイラを聞かせ、または明示的にそれを書くことができます。あなたが持っているとして、あなたは、明示的に記述した場合、初期設定値は、注釈と照合されていますが、(あなたが欲しいタイプの情報を失うので)初期化子の実際の型は変数の型には影響を与えません。あなたはそれを推測コンパイラを聞かせている場合、(あなたが望むように見えるように)特定のインタフェースに適合するためにタイプを制約することはできなくなりました

このためのソリューションは、両方の制約に値を汎用関数を使用して、それが実際の型だ推論することです。

type Pair = {
  key: string;
  value: number;
};
function craetePairsArray<T extends readonly Pair[] & Array<{key: V}>, V extends string>(...args: T) {
    return args
}

const pairs = craetePairsArray(
  { key: 'foo', value: 1 },
  { key: 'bar', value: 2 },
)

type Keys1 = typeof pairs[number]['key']

type Data = {
  name: string;
  age: number;
};

function craeteDataObject<T extends Record<string, Data>>(arg: T) {
    return arg;
}
const DataRecord = craeteDataObject({
  foo: { name: 'Mark', age: 35 },
  bar: { name: 'Jeff', age: 56 },
})

type Keys2 = keyof typeof DataRecord;

遊び場リンク

注:我々は強い腕にビットの文字列リテラルのタイプを推論にコンパイラを必要とするアレイの場合についてkey、したがって全体& Array<{key: V}>Vタイプパラメータが延びていますstring

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21898&siteId=1