“条件类型”不适用于实际功能?

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)

条件类型是否仅适用于“类型定义”..?

Owl*_*Owl 5

简短的回答是你不能。没有值可以分配给未解析的条件类型(仍然依赖于自由泛型类型变量的条件类型)。您唯一能做的就是使用类型断言。

来自: https: //stackoverflow.com/a/52144866/12397250

所以你可以做的是:

1. 类型断言

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)

2.重载方法

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)