Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript “条件类型”不适用于实函数?_Typescript_Typescript Typings - Fatal编程技术网

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'} } } 见