我正在构建一个组件来保存有关在表单中使用的字段的信息。我需要保存各种数据对象来创建用于处理数据的通用例程。
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
将返回一个字符串。
答案 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
}
}