[英]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.
我不知道这里到底有什么问题。 如何确保该value
是T
类型或函数返回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.