我有以下TypeScript
界面和方法:
namespace a {
export interface componentType<T extends component> {
new(element?: HTMLElement): T
runStaticTick(comp: componentType<T>, tick?: number): void
}
export abstract class component {
public static components: component[] = []
public findComponent<T extends component>(comp: componentType<T>, callback?: (comp: T) => void) {
let c = component.components.find(c => c instanceof comp) as T
c instanceof component && typeof callback == 'function' && callback(c)
return c
}
}
export abstract class element extends component { }
}
这是 .d.ts
declare namespace a {
interface componentType<T extends component> {
new(element?: HTMLElement): T;
}
abstract class component {
findComponent<T extends component>(comp: componentType<T>, callback?: (comp: T) => void): T;
}
abstract class element extends component { }
}
然后,为了测试该方法是否有效,我有JavaScript
:
/// <reference path="../src/test.d.ts"/>
class checklist extends a.element {
sayHi() { console.log('Hi') }
}
class myclass extends a.component {
created() {
this.findComponent(checklist, item => {
item.sayHi()
})
}
}
代码在浏览器中有效,但在编辑器中,它表示item
类型为component
时应为checklist
类型。有没有办法解决这个问题,或者这是打字稿的问题吗?
对于完整项目:https://github.com/TheColorRed/horsepower
我弄清楚是什么导致了这个问题:
export interface componentType<T extends component> {
new(element?: HTMLElement): T
runStaticTick(comp: componentType<T>, tick?: number): void
}
如果我发表评论runStaticTick
,它会解决智能感知问题。但后来我有错误说它不存在:
错误TS2339:属性&#39; runStaticTick&#39;类型&#39; componentType&#39;
上不存在
答案 0 :(得分:1)
问题是由于方法runStaticTick
中的属性。
而是使用
comp: componentType<T>
我应该使用
comp: componentType<component>
出于某种原因,T
导致了我不知道的问题。如果有人知道这个问题是什么,请告诉我。