繁体   English   中英

Typescript泛型和功能作为类属性类型

[英]Typescript generics and functions as class attribute type

我有以下代码:

class Test<T> {
    value: T | (() => T);

    determineValue(): T {
        if (typeof this.value === 'function') {
            return this.value();
        }
        return this.value;
    }
}

编译器在调用return this.value()的行中给我一个错误:

error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '(() => T) | (T & Function)' has no compatible call signatures.

我不知道这里到底有什么问题。 如何确保该valueT类型或函数返回T类型的值。

目前,我有一个解决方法,(我认为)这不是很好:

return (<() => T>this.value)();

有人能帮我吗? 谢谢! :-)

如果调用者将T设置为函数类型(例如T = (x: number) => number )并传递类型T的值(即,需要单个参数的函数),则您的代码实际上是不正确的。 您的代码将尝试不带参数的情况下调用此函数。

通过使用具有相同属性但没有调用签名的映射类型来约束T ,可以向编译器提示您不希望T成为函数类型。 也就是说,您可以将Test类的声明更改为:

class Test<T extends { [P in keyof T]: T[P] }> { /* ... */ }

然后错误应该消失。 但是,编译器不会阻止您实际使用函数类型实例化T ,因为函数类型的确扩展了相同的类型,并且删除了调用签名,因此请当心。 (因此,我很惊讶上述技术可以消除错误。可以说,缺少错误可能是一个错误。如果该错误得到修复,我想您只是回到当前的解决方法。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM