web-dev-qa-db-ja.com

パラメータに応じたTypescriptの戻り値の型

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を使用せずに私が望むものを達成する方法はありますか?

7
Lukor

これは正しい方法です:

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を拡張?数値:文字列)がタイプと見なされます。このタイプは 条件付きタイプ と呼ばれます。

0
axell13

このように書けます

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;
    }
}
0