首页 > 解决方案 > 打字稿函数输出不能分配给条件类型

问题描述

我有一个更复杂问题的简化版本。以下导致 TSC 抛出错误:

type Demo<isTrue> = isTrue extends true ? { a: string } : isTrue extends false ? { b: string } : never;

const func = <T extends boolean>(arg: T): Demo<T> => {
    if (arg) {
        return {a: "hello" };
    } else {
        return { b: "world" };
    }
};

const out = func(true);

引发以下错误:

    Type '{ a: string; }' is not assignable to type 'Demo<T>'.
    Type '{ b: string; }' is not assignable to type 'Demo<T>'.

out底部的检查类型正确,所以只是函数定义有问题。我怎样才能更好地理解这一点以及如何解决它?

游乐场链接

标签: typescriptconditional-typesfunction-signature

解决方案


我添加了重载并Demo<boolean>作为返回类型。

在这种特殊情况下T extends boolean,实际上与Demo<boolean>.

但请记住,泛型很棘手。extends不代表equal

type Demo<isTrue> = isTrue extends true ? { a: string } : isTrue extends false ? { b: string } : never;


function func(arg: false): Demo<false>
function func(arg: true): Demo<true>
function func(arg: boolean): Demo<boolean> {
    if (arg === true) {
        const a = arg;
        return { a: "hello" };
    } else {
        return { b: "world" };
    }
};

const out = func(true);

游乐场链接


推荐阅读