fly*_*eep 3 typescript typescript-typings
有一个类型化模块 – '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
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,打字稿抱怨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)
...
}
Run Code Online (Sandbox Code Playgroud)
诀窍是将类声明与扩展原始接口的接口声明合并:
declare module 'markdown-it/lib/token' {
import * as MarkdownIt from 'markdown-it'
interface Token extends MarkdownIt.Token {}
class Token {}
export = Token
}
Run Code Online (Sandbox Code Playgroud)
当您手动复制接口方法时,您发现原始接口声明中似乎有错误,这不会阻止上述技术工作,但仍然是错误的:
interface Token {
new (type: string, tag: string, nesting: number): Token;
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是说一个Token实例可以与new操作符一起使用来创建另一个Token实例,例如:
import Token = require("markdown-it/lib/token");
let a = new Token(...);
let b = new a(...);
Run Code Online (Sandbox Code Playgroud)
那将是非常不寻常的设计,我在 JavaScript 实现中没有看到它实际上受到支持的迹象。请提交问题以删除构造签名。或者,如果您计划将您的增强功能贡献给绝对类型,您可以在同一个拉取请求中进行更改。
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |