1. ホーム
  2. typescript

[解決済み] TypeScriptで、「extends keyof」と「in keyof」はどういう意味ですか?

2022-03-07 02:06:29

質問

TypeScriptでは、いくつかの型は extends keyof または in keyof . 私はこれらの意味を理解しようとしましたが、今のところ成功しませんでした。

私が得たものは、以下の通りです。 keyof の後に指定した型のプロパティ名として存在するすべての名前を可能な値として持つユニオン型を返すだけです。 keyof .

type T = keyof string;

T と同じです。 startsWith | endsWith | trim | substring | ... .

これでよいのでしょうか?

さて、では extends keyofin keyof というのは、私の直感では次のように思うのです。

  • extends keyof から派生した任意の型です。 T すなわち、これらのすべての可能な値、あるいはもっと多くの値を持つ。
  • in keyof から値を取る任意の型です。 T は、必ずしもすべてではない(可能性はあるが、少ないかもしれない)。

つまり、このPOVから extends keyof を記述することになります。 >= の関係にあります。 in keyof を記述することになります。 <= の関係にあります。これは正しいのでしょうか?そうでない場合、何が正しいのでしょうか?

どのように解決するのですか?

どのタイプでも T , keyof T の既知のパブリックプロパティ名の和である。 T .

interface Person {
  age: number;
  name: string;
}

type PersonKeys = keyof Person; // "age" | "name"

というあなたの思い込み keyof stringstartsWith | endsWith | trim | ... は正しい。で詳しく説明しています。 ルックアップタイプのリリースノート .

は、keyof を拡張します。

extends を、この場合、以下のように使用します。 ジェネリックパラメータの型を制約する . 例

<T, K extends keyof T>

K のパブリックプロパティ名のみとすることができます。 T . とは逆に、型の拡張や継承とは何の関係もありません。 エクステンドインターフェース .

の使い方 extends keyof は次のようになる。

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

const person: Person = {
  age: 22,
  name: "Tobias",
};

// name is a property of person
// --> no error
const name = getProperty(person, "name");

// gender is not a property of person
// --> error
const gender = getProperty(person, "gender");

はともかくとして インデックスタイプに関する文書 を発見しました。 この記事は参考になります。 .

をキーに

in を定義する際に使用されます。 インデックス署名 文字列、数値、記号のリテラルの組み合わせで入力します。との組み合わせで keyof を使うことで、いわゆる マップタイプ これは、元の型のすべてのプロパティを再マップするものです。

の使い方 in keyof は次のようになる。

type Optional<T> = { 
  [K in keyof T]?: T[K] 
};

const person: Optional<Person> = {
  name: "Tobias"
  // notice how I do not have to specify an age, 
  // since age's type is now mapped from 'number' to 'number?' 
  // and therefore becomes optional
};

はともかくとして マッピングされた型に関する文書 を発見し、またもや この有用な記事 .

楽しい事実 : その Optional<T> と同じシグネチャを持っています。 Partial<T> ユーティリティタイプ