[解決済み] TypeScriptで、「extends keyof」と「in keyof」はどういう意味ですか?
質問
TypeScriptでは、いくつかの型は
extends keyof
または
in keyof
. 私はこれらの意味を理解しようとしましたが、今のところ成功しませんでした。
私が得たものは、以下の通りです。
keyof
の後に指定した型のプロパティ名として存在するすべての名前を可能な値として持つユニオン型を返すだけです。
keyof
.
type T = keyof string;
T
と同じです。
startsWith | endsWith | trim | substring | ...
.
これでよいのでしょうか?
さて、では
extends keyof
と
in 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 string
は
startsWith | 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>
ユーティリティタイプ
関連
-
[解決済み】Typescriptで、! (エクスクラメーションマーク/バン)演算子でメンバを再参照するのは?
-
[解決済み] 型{ [key: string]: boolean; }は何を意味するのでしょうか?
-
[解決済み] コンストラクタとngOnInitの違いについて
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み] Typescript は ?演算子をサポートしていますか?(そして、それは何と呼ばれているのでしょうか?)
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み] TypeScriptの「keyof typeof」の意味とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] プロパティ 'values' はタイプ 'ObjectConstructor' に存在しません。
-
[解決済み] グローバル定数の定義
-
ts 学習日記1 AssertionError [ERR_ASSERTION]: タスク関数を指定する必要があります
-
[解決済み] オブジェクトの型は「不明」です typescript generics
-
[解決済み] Typescript オブジェクトのインデックス付きメンバの型を強制する?
-
[解決済み] TypeScriptのオブジェクトリテラルでの型定義
-
[解決済み] TypeScriptでインターフェースファイルの定義に基づいたオブジェクトを作成するには?
-
[解決済み] async/await構文で拒否する方法は?
-
[解決済み] タイプスクリプトのレコードタイプとは何ですか?
-
[解決済み】TypeScriptのコンパイルでExperimental decoratorsの警告が出る。