有一个类型化模块– 'markdown-it'
–定义了一个接口,该接口描述了生活在另一个(无类型)模块– 'markdown-it/lib/token'
我想为后者定义类型,为此我创建了一个.d.ts
文件:
declare module 'markdown-it/lib/token' {
import * as MarkdownIt from 'markdown-it'
class Token implements MarkdownIt.Token {}
export = Token
}
可悲的是,Typescript抱怨Token
没有实现MarkdownIt.Token
。
理想情况下,我想告诉Typescript“类和接口是相同的”。但是,即使不可能,我也无法复制定义,因为
类
提供匹配项Token
错误地实现了接口markdownit.Token
。
类型Token
没有为签名new (type: string, tag: string, nesting: number): Token
不管我做什么
class Token implements MarkdownIt.Token {
new (type: string, tag: string, nesting: number): Token
// or
new (type: string, tag: string, nesting: number): Token
// or
constructor(type: string, tag: string, nesting: number)
...
}
答案 0 :(得分:2)
诀窍是将类声明与扩展原始接口的接口声明合并:
declare module 'markdown-it/lib/token' {
import * as MarkdownIt from 'markdown-it'
interface Token extends MarkdownIt.Token {}
class Token {}
export = Token
}
当您手动复制接口方法时,您发现原始接口声明中似乎有一个错误,该错误不会阻止上述技术的工作,但仍然是错误的:
interface Token {
new (type: string, tag: string, nesting: number): Token;
// ...
}
这就是说Token
实例可以与new
运算符一起使用,以创建另一个Token
实例,例如:
import Token = require("markdown-it/lib/token");
let a = new Token(...);
let b = new a(...);
那将是非常不寻常的设计,并且在JavaScript实现中我看不到它实际上受支持的迹象。请file an issue删除结构签名。或者,如果您打算将增强功能贡献给DefinitelyTyped,则可以在同一请求请求中进行更改。