レコードタイプとは何ですか? 質問する

レコードタイプとは何ですか? 質問する

Record<K, T>Typescript ではどういう意味ですか?

Typescript 2.1 では、このRecord型が導入され、例で説明されています。

// For every properties K of type T, transform it to U
function mapObject<K extends string, T, U>(obj: Record<K, T>, f: (x: T) => U): Record<K, U>

見るタイプスクリプト 2.1

そしてその高度なタイプこのページRecordでは、マップされたタイプの見出しの下にReadonly、、、PartialおよびPickの定義と思われるものが次のように記載されています。

type Record<K extends string, T> = {
    [P in K]: T;
}

Readonly、Partial、Pick は同型ですが、Record はそうではありません。Record が同型でないことを示す手がかりの 1 つは、プロパティをコピーするための入力型を必要としないことです。

type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>

以上です。上記の引用文以外にはRecordタイプスクリプト

質問

  1. 誰か、それが何なのか簡単に定義してくれませんかRecord?

  2. Record<K,T>これは単に「このオブジェクトのすべてのプロパティはタイプ 」を持つと言っているだけでしょうかT?何らかの目的があるため、おそらくすべてのプロパティではないでしょう...K

  3. Kジェネリックは、オブジェクト上の ではない追加キーを禁止しますかK、それとも、それらを許可して、そのプロパティが に変換されないことを示すだけですかT?

  4. 与えられた例:

    type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>
    

    これと全く同じですか?:

    type ThreeStringProps = {prop1: string, prop2: string, prop3: string}
    

ベストアンサー1

  1. 誰か、それが何なのか簡単に定義してくれませんかRecord?

A は、プロパティ キーが で、プロパティ値が であるRecord<K, T>オブジェクト型です。つまり、 はと同等であり、は (基本的に) と同等です。KTkeyof Record<K, T>KRecord<K, T>[K]T

  1. Record<K,T>これは単に「このオブジェクトのすべてのプロパティはタイプ 」を持つと言っているだけでしょうか?何らかの目的があるTため、おそらくすべてのオブジェクトではありません...K

ご指摘のとおり、 には、Kプロパティキーを特定の値に制限するという目的があります。すべての可能な文字列値のキーを受け入れたい場合は、 のようにすることができますRecord<string, T>が、慣用的な方法は を使用することです。インデックス署名のように{ [k: string]: T }

  1. Kジェネリックは、オブジェクト上の ではない追加キーを禁止しますかK、それとも、それらを許可して、そのプロパティが に変換されないことを示すだけですかT?

追加のキーを厳密に「禁止」しているわけではありません。結局のところ、値には通常、その型に明示的に記載されていないプロパティを持つことが許可されていますが、そのようなプロパティが存在することは認識されません。

declare const x: Record<"a", string>;
x.b; // error, Property 'b' does not exist on type 'Record<"a", string>'

そして、彼らを余分なプロパティ拒否されることもあります:

declare function acceptR(x: Record<"a", string>): void;
acceptR({a: "hey", b: "you"}); // error, Object literal may only specify known properties

そして時には受け入れられる:

const y = {a: "hey", b: "you"};
acceptR(y); // okay
  1. 与えられた例:

     type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>
    

    これと全く同じですか?:

     type ThreeStringProps = {prop1: string, prop2: string, prop3: string}
    

はい!

おすすめ記事