【问题标题】:How to get the data type in Typescript using Generics如何使用泛型获取 Typescript 中的数据类型
【发布时间】:2018-01-04 20:17:41
【问题描述】:

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

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

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

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

我正在尝试对此进行测试,但我无法从 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');
        });
    });

测试失败,表明类型 getter 函数返回未定义。

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

【问题讨论】:

  • 当我运行此代码 (let TestField: Field&lt;number&gt;) 时,我收到一个 TypeScript 错误,即字符串不可分配给数字
  • 抱歉,创建示例时出现编辑错误。我已将新更新为 Field('Age', 32);所以它会通过 Typescript 编译器。

标签: typescript generics


【解决方案1】:

您的代码运行良好:

TypeScript Playground

我怀疑您的测试运行程序(开玩笑?)正在做一些时髦的事情。将let TestField... 移动到it('...', () =&gt; { /* here */ }) 中,然后重试。

顺便说一句,根据 JavaScript 的一般约定,你的变量和属性应该是驼峰式

【讨论】:

  • 我们的编码标准有 ProperCase,这就是为什么变量是这样的,以帮助从标准库和外部模块中识别我们的代码和函数。
  • 我确实检查了您的示例,它似乎确实有效,但 Jest 有问题,即使在 it() 块中分配变量也是如此。
  • 这很奇怪,我看不出它会失败的其他原因。
  • 我使用了您的 TypeScript Playground,可以看到调试工作正常。然而,Jest 得到了一个未定义的回归。其他的东西似乎都可以正常工作,就这件。
  • 测试中未分配值字段。当我将构造函数参数与传递的参数匹配时,没有发送值,因此 undefined 是正确的响应。
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 2021-07-10
  • 2020-11-15
  • 2019-07-27
  • 1970-01-01
  • 2021-08-06
  • 2023-04-02
相关资源
最近更新 更多