gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:43 24 4
gpt4 key购买 nike

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

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

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

new DataField<string>('FullName', 32);

通用类型 T 现在是 string,但我希望能够获取 Type_ 变量集,以便对 get Type() 的调用将返回一个字符串。

最佳答案

您需要将类型作为参数传递给您的构造函数;在 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 调用时,它将创建一个具有所需原型(prototype)的对象。

请注意,您确实不需要泛型,因为您当前的类已构建(我只是为了举例而保留了它);没有它它也能正常工作。您可以将 {new (...args): T} 替换为 {new (...args): any}。如果您想要一个返回具有正确类型的实际值的数据容器类,您将需要一个泛型:

class DataContainer<T> {
// other class stuff

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

关于typescript - 如何使用 Typescript 将类中的变量初始化为其通用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com