1. ホーム
  2. typescript

[解決済み] タイプスクリプトのレコードタイプとは何ですか?

2022-03-27 21:55:58

質問

とは何ですか? 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が同型でない一つの手がかりは、プロパティをコピーするための入力型を取らないということです。

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

そして、これで終わりです。上記の引用文の他には Record について typescriptlang.org .

質問内容

  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. の簡単な定義を教えてください。 Record は?

A Record<K, T> はオブジェクトタイプで、プロパティキーは K で、そのプロパティ値は T . つまり keyof Record<K, T> は、以下のものと同等です。 K であり、かつ Record<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}
    
    

やったー!!!(笑

お役に立てれば幸いです。 幸運を祈ります。