Boolean型のパラメーターを取り、入力の値に応じて2つの型のいずれかを返す関数を記述しようとしています。私は2つのアプローチを見つけました:
function dependsOnParameter<B extends boolean>(x: B): B extends true ? number : string {
if (x) {
return 3;
} else {
return "string";
}
}
ここで、TypeScriptはType '3'/'"string"' is not assignable to type 'B extends true ? number : string'.
私の他のアプローチは次のようになります:
function dependsOnParameter(x: true): number;
function dependsOnParameter(x: false): string;
function dependsOnParameter(x: boolean): number | string {
if (x) {
return 3;
} else {
return "string";
}
}
これはコンパイルされます。ただし、自分の関数を使用しようとすると、
function calling(x: boolean) {
dependsOnParameter(x);
}
Argument of type 'boolean' is not assignable to parameter of type 'false'
。
any
を使用せずに私が望むものを達成する方法はありますか?
これは正しい方法です:
function dependsOnParameter<B extends boolean>(x: B): B extends true ? number : string {
return (x === true ? 3 : "string") as B extends true ? number : string;
}
ここでは、条件自体(Bがtrueを拡張?数値:文字列)がタイプと見なされます。このタイプは 条件付きタイプ と呼ばれます。
このように書けます
function dependsOnParameter<B extends boolean, C = B extends true ? number : string>(x: B): C {
if (x) {
return 3 as unknown as C;
} else {
return "string" as unknown as C;
}
}