打字稿通用专长

时间:2019-05-14 21:24:16

标签: typescript generics

我正在寻找与Typescript泛型类似的专业知识,在这些泛型中,根据类型标准可以将实现分离。

一个最小的例子:

const someFunction = <A>() => { return 0; }

// something like this
<A extends String>someFunction = (a: A) => { return 1; }
<A extends Number>someFunction = (a: A) => { return 2; }
.
.
.

console.log(someFunction(false)); // prints 0
console.log(someFunction('string')); // prints 1
console.log(someFunction(42)); // prints 2

这是我想要的“剑”。在Typescript中可以吗?

2 个答案:

答案 0 :(得分:0)

您所谈论的内容在Typescript中不存在。与此最接近的是function overload。根据您的示例,它看起来像这样:

function someFunction(a: boolean): 0
function someFunction(a: string): 1
function someFunction(a: number): 2
function someFunction(a: any) {
  if(typeof a === 'boolean') {
    return 0
  } else if (typeof a === 'string') {
    return 1
  } else if (typeof a === 'number') {
    return 2
  }
}

此示例适用于原语和typeof,但适用于复杂值和其他type guards包括用户定义的类型防护。

答案 1 :(得分:0)

TypeScript 中还有一个有趣的特性叫做“类型保护”:

export function isString(value: any): value is string {
  return typeof value === 'string' || value instanceof String;
}

使用这样定义的函数,您可以创建如下表达式:

function validate(value: string|string[]): string|void {
  if (isString(value) && value.replace(/\s+|\s+/g, '') === '')) {
    return this.msg;
  }
}

请注意,该方法 replace 在类型 string[] 中不存在,因此如果我只是使用函数重载,编译器会引发错误。