TypeScript 泛型特化

9
我正在寻找类似于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中是否可能实现?

3
虽然可以修改TypeScript以支持这一点,但这将违反设计非目标#5关于根据类型系统结果发出不同JavaScript代码的规定。 - jcalz
2个回答

3
你所说的在TypeScript中并不存在。最接近这个概念的是函数重载。根据你的示例,它应该如下所示:
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,但是对于复杂的值以及其他类型守卫,包括用户定义的类型守卫,都可以适用。


是的和不是的。它们共享一个函数体,这是我试图避免的一件事情。此外,typeof 在这种方法中只对原始类型成功。接口将全部返回“object”,因此除非它们保证是原始类型,否则没有简单的方法对类型进行编码条件。最后,TypeScript 将在编译时具有足够的信息来选择函数。这种方法是在运行时完成的。 - Anthony
我认为你所说的在TypeScript中无法实现。我的示例使用typeof,因为你的示例使用原始值。你也可以使用用户定义的类型保护来实现同样的效果。 - Donovan Hiland
更新帖子以匹配。 - Donovan Hiland
@AnthonyMonterrosa,您要找的是类型保护,因为它们在静态分析期间用于推断给定对象的类型。 - Christian Ivicevic

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;
  }
}

请注意,类型为string[]的方法replace不存在,因此如果我仅使用函数重载,编译器将引发错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接