如何使用Generics获取Typescript中的数据类型

时间:2018-01-04 20:17:42

标签: typescript generics

我有一个使用泛型构建的数据结构。当我去填充数据时,我想确保我可以将一些简单的格式转换为正确的类型。由于我们使用Generics配置了类,我似乎无法检测其他代码中的数据类型。

这是从我的代码中提取的一个简单示例:

export class Field<T> {
    private Name_: string;
    private Value_: T;

    constructor(FieldName:string, Data?:T) {
        this.Name_ = FieldName;
        if( Data !== undefined) {
            this.Value_ = Data;
        }
    }

    /**
     * Get the data value from this class
     * @returns T The value from Value_
     */
    get Value(): T {
        return this.Value_;
    }

    get Type(): string {
        return typeof this.Value_;
    }

    /**
     * Set the data into the data value
     * @param Data T Generic Data member as the raw data to be stored in the field.
     */
    set Value(Data:T) {
        this.Value_ = Data;
    }
}

这是一个简单的代码片段来演示此问题。我的结构(字段)使用泛型(字段)定义,我希望数据中的值属于该类型。

我正在尝试测试这个但是我无法从Object获取类型(因为它是Field类型),所以我试图获取内部数据字段的类型。

    describe('Get Type of Value', () => {
        let TestField:Field<number> = new Field<number>('Age', 32);
        it('should return the value type from the definition', () => {
            expect(TestField.Type).toBe('number');
        });
    });

测试失败,表明Type getter函数返回undefined。

 FAIL  
    Expected value to be (using Object.is):
      "number"
    Received:
      "undefined"

1 个答案:

答案 0 :(得分:0)

您的代码运行正常:

TypeScript Playground

我怀疑你的测试跑步者(Jest?)正在做一些时髦的事情。将let TestField...移到it('...', () => { /* here */ })内,然后重试。

顺便说一下,根据JavaScript的一般惯例,你的变量和属性应该是驼峰式的