用于基元的案例泛型类型参数

背景

我在TypeScript中有以下泛型类,它接受构造函数和回调作为其构造函数参数:

class InputDataPort<T> {
    constructor(type: new (...args: any[]) => T, listener?: (data: T) => void);
    onUpdate(listener?: (data: T) => void);

    // ... lots of other methods depending on the generic type parameter 'T'
}
var dataPortA = new InputDataPort(Array, array => console.log(array)); // T: Array
var dataPortB = new InputDataPort(Date, array => console.log(array)); // T: Date
...

在这里,我基本上将泛型类型参数定义为构造函数参数。 这样做的原因是我需要在运行时知道泛型类型,并且这种方法可以实现这一点。

问题

但是,我遇到了原始类型的问题。 基本上,当我做到以下几点时:

var dataPortN = new InputDataPort(Number, num => console.log(num));

num的类型是Number ,而TypeScript编译器不允许将Number分配给一个number (显然,不能将number指定为要type的参数):

var myNum: number;

// ERROR: 'number' is a primitive, but 'Number' is a wrapper object ...
var dataPortM = new InputDataPort(Number, num => myNum = num);

在这种情况下(以及在其他基元/包装类型的情况下),我想使用相应的基元类型作为泛型类型参数T

基本上,我正在寻找下面的类型定义:

  • 如果T是数字,那么数字
  • 否则,如果T是字符串,则是字符串
  • 否则,如果T是布尔值,则布尔值
  • 其他T原样
  • 据我所知,方法重载在这里是不够的,因为它不提供类级别的泛型类型。


    虽然我不确定在问题中描述的要求是否可能,但是一个可靠的解决方法是针对每种基本类型专门设计基本的InputDataPort类。

    例如,要支持number ,可以这样做:

    class InputNumberDataPort extends InputDataPort<number> {
        constructor(listener?: (data: number) => void) {
            super(Number as any, listener);
        }
    }
    

    其余的与InputStringDataPortInputBooleanDataPort等相同。 这种方法将为TypeScript编译器提供正确的通用类型,并在运行时提供正确的对应构造函数引用。

    链接地址: http://www.djcxy.com/p/43157.html

    上一篇: case generic type parameters for primitives

    下一篇: Generic type parameter inference priority in TypeScript