[解決済み] なぜTypescriptではinferキーワードが必要なのでしょうか?
2022-03-02 08:29:54
質問
なぜTypescriptの人たちは
infer
というキーワードがあります。
によると
ドキュメント
, これはその使い方の例です。
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
なぜこれが必要なのか理解できない。なぜ、それだけではダメなのか。
type ReturnType<T> = T extends (...args: any[]) => R ? R : any;
なぜうまくいかないのか?なぜ
infer
というキーワードが必要なのでしょうか?
どのように解決するのですか?
と
infer
この場合、コンパイラはすべての型変数を宣言したことを確認します。
明示的に
:
type MyType<T> = T extends infer R ? R : never;
type T1 = MyType<{b: string}> // T1 is { b: string; }
ここでは
新しい
型変数
R
で
MyType
は、どの
推論される
から
T
.
(
なお、この
infer
は常に
extends
の句は
条件付きタイプ
.
)
宣言されていない型パラメーターを使用すると、コンパイルエラーになることがあるようになりました。
type MyType2<T> = T extends R2 ? R2 : never; // error, R2 undeclared
なし
infer
この場合、コンパイラは追加の型変数を導入したいのかどうかがわかりません。
R2
が推論される場合(最初のケースを参照)、あるいは
R2
は、単なる偶然のタイプミス/タイポです。
infer
は、この曖昧さをなくすために存在します。
より正確には、コンパイラは、もし
T
が代入可能かどうか
から
R
の場合
infer
が省略されます。
type R = { a: number }
type MyType3<T> = T extends R ? R : never; // compare T with type R
type T2 = MyType2<{b: string}> // T2 is never
なお、この
infer R
は、同じ名前の型宣言の型参照に影を落としています。
R
:
type R = { a: number }
type MyType<T> = T extends infer R ? R : never;
type T1 = MyType<{b: string}> // { b: string; }
関連
-
[解決済み] Webpack with typescriptでTypeScript emitted no outputエラーが発生する。
-
[解決済み] TypeScriptで、「extends keyof」と「in keyof」はどういう意味ですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] TypeScriptでの取得と設定
-
[解決済み] volatileキーワードは何に役立つのでしょうか?
-
[解決済み] Typescript によるインターフェース型チェック
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み】Typescript d.ts ファイルで定義されたインターフェースプロパティタイプのオーバーライド
最新
-
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' に存在しません。
-
[解決済み] Apollo Serverでコンテキストオブジェクトを正しく入力するにはどうすればよいですか?
-
[解決済み] TypeScriptで、「extends keyof」と「in keyof」はどういう意味ですか?
-
[解決済み] オブジェクトの型は「不明」です typescript generics
-
[解決済み] Object literal may only specify known properties" というエラーが発生するのはなぜですか?
-
[解決済み] タイプスクリプト TS7006 です。パラメータ 'xxx' は暗黙のうちに 'any' 型を持ちます。
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み] 'unknown' vs. 'any'
-
[解決済み] types/* を `dependencies` と `devDependencies` のどちらに入れるかは、どのように決めたらよいですか?
-
[解決済み】TypeScriptとフィールドイニシャライザー