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>
そしてその高度なタイプこのページ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
、タイプスクリプト。
質問
誰か、それが何なのか簡単に定義してくれませんか
Record
?Record<K,T>
これは単に「このオブジェクトのすべてのプロパティはタイプ 」を持つと言っているだけでしょうかT
?何らかの目的があるため、おそらくすべてのプロパティではないでしょう...K
K
ジェネリックは、オブジェクト上の ではない追加キーを禁止しますかK
、それとも、それらを許可して、そのプロパティが に変換されないことを示すだけですかT
?与えられた例:
type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>
これと全く同じですか?:
type ThreeStringProps = {prop1: string, prop2: string, prop3: string}
ベストアンサー1
- 誰か、それが何なのか簡単に定義してくれませんか
Record
?
A は、プロパティ キーが で、プロパティ値が であるRecord<K, T>
オブジェクト型です。つまり、 はと同等であり、は (基本的に) と同等です。K
T
keyof Record<K, T>
K
Record<K, T>[K]
T
Record<K,T>
これは単に「このオブジェクトのすべてのプロパティはタイプ 」を持つと言っているだけでしょうか?何らかの目的があるT
ため、おそらくすべてのオブジェクトではありません...K
ご指摘のとおり、 には、K
プロパティキーを特定の値に制限するという目的があります。すべての可能な文字列値のキーを受け入れたい場合は、 のようにすることができますRecord<string, T>
が、慣用的な方法は を使用することです。インデックス署名のように{ [k: string]: T }
。
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
与えられた例:
type ThreeStringProps = Record<'prop1' | 'prop2' | 'prop3', string>
これと全く同じですか?:
type ThreeStringProps = {prop1: string, prop2: string, prop3: string}
はい!