TypeScript:作为函数返回值的条件泛型类型不可赋值

TypeScript:作为函数返回值的条件泛型类型不可赋值,typescript,Typescript,我的一个通用函数中存在可赋值问题: interface BuildArguments<T extends string> { type: T; } type PromiseResult<T> = T extends 'standalone' ? Promise<void> : T extends 'all' ? Promise<void> : Promise<void[]>; const fo

我的一个通用函数中存在可赋值问题:

interface BuildArguments<T extends string> {
    type: T;
}

type PromiseResult<T> =
    T extends 'standalone' ? Promise<void> :
    T extends 'all' ? Promise<void> :
    Promise<void[]>;    

const foo: PromiseResult<'standalone'> = Promise.resolve();
const bar: PromiseResult<'all'> = Promise.resolve();
const baz: PromiseResult<'foo'> = Promise.resolve([]);

bundle({ type: 'foo' });

function bundle<T extends string>(buildArguments: BuildArguments<T>): PromiseResult<T> {
    switch (buildArguments.type) {
        case 'standalone':
            return Promise.resolve(); // error here, not assignable to PromiseResult<T>
        case 'all':
            return Promise.resolve(); // error here, not assignable to PromiseResult<T>
        default:
            return Promise.all([ // error here, not assignable to PromiseResult<T>
                Promise.resolve(),
                Promise.resolve()
            ]);
    }
}
接口构建参数{
类型:T;
}
类型提示结果=
T扩展“独立”吗?承诺:
T扩展“全部”?承诺:
承诺;
const-foo:PromiseResult=Promise.resolve();
常量栏:PromiseResult=Promise.resolve();
const baz:PromiseResult=Promise.resolve([]);
bundle({type:'foo'});
函数包(buildArguments:buildArguments):PromiserResult{
开关(buildArguments.type){
“独立”案例:
return Promise.resolve();//此处有错误,不可分配给PromiserResult
“全部”案例:
return Promise.resolve();//此处有错误,不可分配给PromiserResult
违约:
return Promise.all([//此处出错,不可分配给PromiseResult
承诺。解决(),
承诺,决心
]);
}
}
const
s
foo
bar
baz
表明条件类型工作正常。函数调用
bundle({type:'foo'})
也正确地提供了类型
Promise
,如果您使用ts游乐场并将鼠标悬停在其上。为什么它对返回值不起作用?
我还尝试过,如果这是由于TypeScript无法通过向函数添加
kind:T
参数来推断
T
,但没有任何更改。断言
PromiseResult.resolve()
PromiseResult
效果很好。

Typescript通常不允许您处理条件类型,只要它们仍然有未解析的条件类型(就像
PromiseResult
中的情况一样)

此外,在本例中,您假设缩小
buildArguments.type
会缩小
T
。事实并非如此。缩小范围将缩小一个值,而不是整个类型参数。这不是别的办法,考虑这个例子:

function foo<T extends string | number>(a: T, b: T) {
    if(typeof a === "string") {
        // should b be string? No
    }
}

foo<string | number>(1, "");
function bundle<T extends string>(buildArguments: BuildArguments<T>): PromiseResult<T>
function bundle(buildArguments: BuildArguments<string>): PromiseResult<'standalone' | 'all'> | PromiseResult<string> {
    switch (buildArguments.type) {
        case 'standalone':
            return Promise.resolve(); 
        case 'all':
            return Promise.resolve(); 
        default:
            return Promise.all([ 
                Promise.resolve(),
                Promise.resolve()
            ]);
    }
}