TypeScript:声明实现接口的类

4

有一个类型化模块 - '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)
...
}
1个回答

9
诀窍在于将类声明与扩展原始接口的接口声明合并:

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实现中看不到任何支持它的迹象。请提交问题以删除构造签名。或者,如果您计划向DefinitelyTyped贡献您的增强功能,可以在同一拉取请求中进行更改。

是的,new声明确实在原始代码中(没有构造函数)。谢谢,这个方法可行! - flying sheep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接