如何使用Typescript将类中的变量初始化为其泛型值
我正在构建一个组件来保存表单中使用的字段信息。我需要保存各种数据对象来创建处理数据的通用例程如何使用Typescript将类中的变量初始化为其泛型值,typescript,generics,Typescript,Generics,我正在构建一个组件来保存表单中使用的字段信息。我需要保存各种数据对象来创建处理数据的通用例程 export class DataField<T> { /** * Data field name IE: database column name, JSON field, etc. */ private Name_: string; private Size_: number; /** * The data type for
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();
}
}
导出类数据字段{
/**
*数据字段名IE:数据库列名、JSON字段等。
*/
私有名称:字符串;
私人规模:数量;
/**
*此字段的数据类型。例如:字符串、布尔值等。请注意,这是在内部设置的,而不是由传递的引用设置的
*/
私有类型:T;
//私有类型:{new():T;}您需要将该类型作为参数传递给构造函数;在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"
get Type()
返回的字符串是原样的……不是吗?类型
从来没有被赋值……那么它怎么可能不是未定义的
?您希望类型
的内容是什么?如果您询问如何获取默认值,而您只有t
作为泛型类型参数-答案是您不能t、 从生成的javascript中删除类型参数。另请参见和@Sébastien。我从类型_389;返回一个字符串值,如“boolean”、“number”、“string”等。我希望这可以告诉我数据的类型。您是正确的,因为它没有初始化为任何内容,这是我正在尝试的,因此我可以从中获取类型。“我想让它告诉我数据的类型“哪个数据的数据类型?如果您从未给type\uuu
属性赋值,那么它除了undefined
之外就没有其他类型了。我想我还是不明白您想做什么……我想用泛型是没有办法的,也不必在新的数据字段上将类型再次传递给构造函数。”(键入'name',256),其中类型为布尔值、数字等?我想问题在于,如果我按照您建议的字符串传递类型(Visual Studio代码警告的是用作值的类型)然后我就可以很容易地传递文本表示“string”和更简单的构造函数。我真的希望能够做同样的事情,但使用泛型类型,而不使用额外的构造函数变量。我想这在当前的Typescript中是无法做到的。我知道Javascript将不支持这一点,但它主要是在Typescript中进行类型检查,然后再进行库处理。如果Typescript确实支持这一点,那么它只是ctor变量的语法糖。请注意,string
和string
之间有很大区别:string
是一种基本的JavaScript值类型(包括number
、boolean
、object
和undefined
等)和String
是一个本机函数(也称为类)。作为一个符号,String
只存在于TypeScript中。注意,不应使用本机类(String
、number
)等)要创建新的原语值:35!==newnumber('35')
我使用的不是字符串,而是字符串,但是是的,语法糖会很好。
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"
class DataContainer<T> {
// other class stuff
public getValue(): T {
// do stuff to return value
}
}