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
sfoo
、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()
]);
}
}