[解決済み] ユニオン型からインターセクション型への変換
2022-09-01 10:39:53
質問
論理和型から論理積型に変換する方法はありますか?
type FunctionUnion = () => void | (p: string) => void
type FunctionIntersection = () => void & (p: string) => void
に変換をかけたい。
FunctionUnion
に適用して
FunctionIntersection
どのように解決するのですか?
論理和から論理積に変更しますか? 条件分岐型 と 条件付き型からの推論 がそれを可能にします。 (交差結合はできないと思いますが。すみません) これが邪道マジックです。
type UnionToIntersection<U> =
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
これは、ユニオンを分散させる
U
を分配し、すべての構成要素がcontravariantな位置にある新しい和集合に再パッケージ化します。 これにより、型は交差点として推論されるようになる
I
として推論することができます。
同様に、逆変数の位置にある同じ型変数の候補が複数あると、交差型が推論されることになります。
動作するかどうか見てみましょう。
まず、あなたの
FunctionUnion
と
FunctionIntersection
というのは、TypeScriptは関数のreturnよりもunion/intersectionをより強く束縛しているように見えるからです。
type FunctionUnion = (() => void) | ((p: string) => void);
type FunctionIntersection = (() => void) & ((p: string) => void);
テスト中です。
type SynthesizedFunctionIntersection = UnionToIntersection<FunctionUnion>
// inspects as
// type SynthesizedFunctionIntersection = (() => void) & ((p: string) => void)
良さそうですねぇ。
注意点としては、一般的に
UnionToIntersection<>
はTypeScriptが実際のユニオンだと考えていることの詳細をいくつか暴露していることに注意。 例えば
boolean
はどうやら内部的には
true | false
と表現されるようです。
type Weird = UnionToIntersection<string | number | boolean>
になる
type Weird = string & number & true & false
は、TS3.6+ではeagerlyに縮小され
type Weird = never
である値を持つことは不可能だからです。
string
と
number
と
true
と
false
.
お役に立てれば幸いです。 幸運を祈ります。
関連
-
[解決済み] TypeScriptでパラメータとして強く型付けされた関数は可能か?
-
[解決済み] Typescript オブジェクトのインデックス付きメンバの型を強制する?
-
[解決済み] Typescript によるインターフェース型チェック
-
[解決済み] Typescript Date Type?
-
[解決済み] TypeScriptで Object.keys return string[].
-
[解決済み] TypeScriptの予約語 "type "とは何ですか?
-
[解決済み] ts ES5/ES3の非同期関数やメソッドには、「Promise」コンストラクタが必要です。
-
[解決済み] Angular 2でアプリ起動時にサービスを実行する方法
-
[解決済み] 文字列ユニオンから文字列配列へ
-
[解決済み] tsconfig.jsonのtargetは何のためにあるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] TypeScriptで Object.keys return string[].
-
[解決済み] TypeScriptの予約語 "type "とは何ですか?
-
[解決済み] describe'という名前が見つかりません。テストランナー用の型定義をインストールする必要がありますか?
-
[解決済み] ts ES5/ES3の非同期関数やメソッドには、「Promise」コンストラクタが必要です。
-
[解決済み] Typescriptでインターフェースやクラスを使用する場合 [重複].
-
[解決済み] Angular 2でアプリ起動時にサービスを実行する方法
-
[解決済み] tsc が `TS2307: Cannot find module` for a local file をスローします。
-
[解決済み] tsconfig.jsonのtargetは何のためにあるのですか?
-
[解決済み] Visual Studio Code - インポート引用符の設定を調整する