Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Typescript将类中的变量初始化为其泛型值_Typescript_Generics - Fatal编程技术网

如何使用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
   }
}