首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录:声明类实现接口

类型记录:声明类实现接口
EN

Stack Overflow用户
提问于 2018-10-22 13:25:33
回答 1查看 2.8K关注 0票数 3

有一个类型化模块-- 'markdown-it' --定义一个接口,该接口描述生活在另一个(非类型化)模块中的类-- 'markdown-it/lib/token'

我想为后者定义类型,为此我创建了一个.d.ts文件:

代码语言:javascript
复制
declare module 'markdown-it/lib/token' {
    import * as MarkdownIt from 'markdown-it'

    class Token implements MarkdownIt.Token {}
    export = Token
}

遗憾的是,类型记录抱怨Token没有实现MarkdownIt.Token

最理想的是,我想告诉打字稿“类和界面是相同的”。但即使这是不可能的,我甚至不能复制定义,如

Token不正确地实现接口markdownit.Token。 类型Token不提供签名new (type: string, tag: string, nesting: number): Token的匹配。

不管我做了什么

代码语言:javascript
复制
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)
...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-22 14:01:13

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

代码语言:javascript
复制
declare module 'markdown-it/lib/token' {
    import * as MarkdownIt from 'markdown-it'

    interface Token extends MarkdownIt.Token {}
    class Token {}
    export = Token
}

当您手动复制接口方法时,您会发现原始接口声明中似乎是一个错误,它不会阻止上述技术的工作,但仍然是错误的:

代码语言:javascript
复制
interface Token {
    new (type: string, tag: string, nesting: number): Token;
    // ...
}

这意味着Token实例可以与new操作符一起使用来创建另一个Token实例,例如:

代码语言:javascript
复制
import Token = require("markdown-it/lib/token");
let a = new Token(...);
let b = new a(...);

这将是非常不寻常的设计,我在JavaScript实现中没有看到它实际上被支持的迹象。请提出问题删除构造签名。或者,如果您计划将您的增强贡献到DefinitelyTyped,则只需在相同的拉请求中进行更改即可。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52930536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档