yaq*_*awa 1 typescript typescript-typings
我正在阅读https://www.typescriptlang.org/docs/handbook/2/conditional-types.html
我想知道为什么这行不通?
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' }
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这会起作用(这是文档给出的示例),但这完全没用,甚至不返回任何值......
function createLabel<T extends number | string>(idOrName: T): NameOrId<T> {
throw "unimplemented";
}
Run Code Online (Sandbox Code Playgroud)
条件类型是否仅适用于“类型定义”..?
简短的回答是你不能。没有值可以分配给未解析的条件类型(仍然依赖于自由泛型类型变量的条件类型)。您唯一能做的就是使用类型断言。
来自: https: //stackoverflow.com/a/52144866/12397250
所以你可以做的是:
function createLabel<T extends number | string>(idOrName: T): NameOrId<T> {
if (typeof idOrName === 'number') {
return { id: 1 } as NameOrId<T>
} else {
return { name: 'foo' } as NameOrId<T>
}
}
Run Code Online (Sandbox Code Playgroud)
function createLabel<T extends number | string>(idOrName: T): NameOrId<T>;
function createLabel(idOrName: number | string): IdLabel | NameLabel {
if (typeof idOrName === 'number') {
return { id: 1 }
} else {
return { name: 'foo' }
}
}
Run Code Online (Sandbox Code Playgroud)