如何使用Typescript将类中的变量初始化为其通用值

时间:2018-01-22 22:56:42

标签: typescript generics

我正在构建一个组件来保存有关在表单中使用的字段的信息。我需要保存各种数据对象来创建用于处理数据的通用例程。

In [7]: output = {"foo": 0}

In [8]: if not output.get("foo"):
   ...:     output['foo'] = 1
   ...:

In [9]: output
Out[9]: {'foo': 1}

我遇到的问题是字段Type_未初始化为任何内容,因此它始终设置为undefined。当我使用泛型创建DataField时,它可能看起来像:

export class DataField<T> {
    /**
     * Data field name IE: database column name, JSON field, etc.
     */
    private Name_: string;
    private Size_: number;
    /**
     * The data type for this field. IE: String, Boolean, etc. Note that this is set internally, and is not set by a passed reference
     */
    private Type_: T;
    // private Type_: { new(): T ;}   <- this has not worked either

    /**
     * Class constructor
     * @param FieldName string Name of the Field
     * @param FieldSize number Field Size
     */
    constructor(FieldName:string, FieldSize:number) {
        this.Name_ = FieldName;
        this.Size_ = FieldSize;
    }

    /**
     * Get the data type for the value
     * @returns string The TypeOf the value
     */
    get Type(): string {
        return (typeof this.Type_).toString();
    }
}

泛型类型T现在是new DataField<string>('FullName', 32); ,但我希望能够获得Type_变量集,以便调用string将返回一个字符串。

1 个答案:

答案 0 :(得分:4)

您需要将类型作为参数传递给构造函数;在TypeScript中,不需要将其明确地设置为通用:

class DataField<T> {

    constructor( 
        private type: {new (...args): T}, 
        private fieldName: string, 
        private fieldSize: number) {}

    public getType(): string {
        return this.type.name;
    }
}

const field = new DataField(String, 'name', 256);
console.log(field.getType()); // outputs "String"

记住JS中的类只不过是函数,class声明是语法糖。 JavaScript中的“类型”只不过是构造函数(在函数对象本身中),当使用new调用时,它将创建一个具有所需原型的对象。

注意你真的不需要泛型,因为你当前的类是构建的(我只是为了举例而离开它);没有它它会运作得很好。您可以将{new (...args): T}替换为{new (...args): any}。如果您想要一个返回具有正确类型的实际值的数据容器类,您将需要一个泛型:

class DataContainer<T> {
   // other class stuff

   public getValue(): T {
      // do stuff to return value
   }
}