如何解决Typescript抽象属性未获取函数arg类型
我正在尝试创建一个通用的抽象类,以便能够传递一种类型,以迫使开发人员实现所传递的类型。但是由于某些原因,除非我进一步键入,否则函数的参数将被键入为任意类型类中扩展抽象的属性。
下面是我要达到的目标的简化类。
在Generic1中,参数都是任意两个类型,但是返回类型正确。
在Generic2中,参数既是正确的类型又是返回类型,但是必须再次添加控件属性的类型才能使其正常工作。
我错过了什么吗?我希望使用Generic1,但不确定是否可以。
declare type Signiture<L> = {
[E in keyof L]: [any,any?];
};
declare type ControlSignature<L extends Signiture<L>> = {
[E in keyof L]: (params: L[E][0]) => Promise<L[E][1]>;
};
abstract class Abstract<
C extends Signiture<C> = {[messageName: string]: [any,any?] | [void,any?]}
> {
protected abstract control: ControlSignature<C>;
}
interface X {
test1: [{ hello: string },{ world: string }],test2: [{ nothing: number },{ something: number }],}
class Generic1 extends Abstract<X> {
control = {
test1: async (params) => {
return { world: "test" }
},test2: async (params) => {
return { something: 1 }
}
}
}
class Generic2 extends Abstract<X> {
control: ControlSignature<X> = {
test1: async (params) => {
return { world: "test" }
},test2: async (params) => {
return { something: 1 }
}
}
}
解决方法
不幸的是,至少从TS 4.0开始,这是TypeScript的设计限制。
当前,未显式注释的子类的初始化属性被推断为具有初始化值的类型,而无需关注超类。
有一个未解决的问题(此时已很久了),microsoft/TypeScript#10570,它跟踪关于从其超类继承已初始化属性的类型的建议。您可能想要转到上面的问题,并给它一个?,以记录您对此发生的愿望,但是我怀疑这会产生很大的影响。
似乎人们通常对当前行为不满意。但是先前解决此问题的尝试microsoft/TypeScript#6118和microsoft/TypeScript#10610失败了,因为它们在常见的使用案例中给出了奇怪的结果(例如,使用上下文类型),或者因为它们破坏了依赖的真实世界代码当前行为。
由于要求希望当前缩小行为的用户显式注释其子属性是一项重大更改,因此尚不清楚如何前进。除非能带来绝对明显的好处,而不是解决依赖TypeScript的实际代码库,否则,通常避免破坏性的更改。有许多TypeScript功能可以说是以“错误的方式”实现的,但是它们不足以令人震惊,不能保证当前用户的稳定。如果您有业余时间机器并且不想尝试防止各种历史灾难,则可以改正这些。
在当前时间轴上,当自己注释属性的解决方法很容易做到时,可能很难断定值得打破依赖于属性获取初始化程序类型的现有代码。
因此,现在我要说的是自己注释属性并继续。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。