Typescript “条件类型”不适用于实函数?
我在看书 我想知道为什么这行不通Typescript “条件类型”不适用于实函数?,typescript,typescript-typings,Typescript,Typescript Typings,我在看书 我想知道为什么这行不通 interface IdLabel { id: number } interface NameLabel { name: string } type NameOrId<T extends number | string> = T extends number ? IdLabel : NameLabel; function createLabel<T extends number | string>(idOrName:
interface IdLabel {
id: number
}
interface NameLabel {
name: string
}
type NameOrId<T extends number | string> = T extends number
? IdLabel
: NameLabel;
function createLabel<T extends number | string>(idOrName: T): NameOrId<T> {
if (typeof idOrName === 'number') {
return { id: 1 }
} else {
return { name: 'foo' }
}
}
然而,这将工作,这是由文件给出的例子,但这是完全无用的,它甚至不返回任何值
function createLabel<T extends number | string>(idOrName: T): NameOrId<T> {
throw "unimplemented";
}
条件类型是否仅适用于类型定义
简单的答案是你不能。任何值都不能分配给未解析的条件类型—仍然依赖于自由泛型类型变量的条件类型。您唯一能做的就是使用类型断言
发件人:
因此,您可以做的是:
1.类型断言
函数createLabelidOrName:T:NameOrId{
如果idOrName的类型=='number'{
返回{id:1}作为NameOrId
}否则{
返回{name:'foo'}作为NameOrId
}
}
2.重载该方法
函数createLabelidOrName:T:NameOrId;
函数createLabelidOrName:number | string:IdLabel | NameLabel{
如果idOrName的类型=='number'{
返回{id:1}
}否则{
返回{name:'foo'}
}
}
简单的答案是你不能。任何值都不能分配给未解析的条件类型—仍然依赖于自由泛型类型变量的条件类型。您唯一能做的就是使用类型断言
发件人:
因此,您可以做的是:
1.类型断言
函数createLabelidOrName:T:NameOrId{
如果idOrName的类型=='number'{
返回{id:1}作为NameOrId
}否则{
返回{name:'foo'}作为NameOrId
}
}
2.重载该方法
函数createLabelidOrName:T:NameOrId;
函数createLabelidOrName:number | string:IdLabel | NameLabel{
如果idOrName的类型=='number'{
返回{id:1}
}否则{
返回{name:'foo'}
}
}
见