我正在尝试通过名为marked
的{{1}}插件在Typescript
应用中使用名为angular
的热门JavaScript库。
angular-marked
在DefinitelyTyped上有marked
个文件,因此我将其包含在内。
现在,问题是.d.ts
有一个名为angular-marked
的新函数,它接收一个应该与setRenderer
匹配的对象文字。这在普通的javascript中不是问题。
marked.Renderer
未在typescript定义中定义,但是setRenderer
是(理论上)通过该函数的参数类型。所以我试着让我自己的界面来声明它,就像这样;
MarkedRenderer
这看起来很简单。但是当我尝试使用它时,我会得到各种各样的废话。例如,我想简单地覆盖它输出interface MarkedStatic {
setRenderer(renderer: MarkedRenderer): MarkedStatic;
}
的方式。在普通的javascript中,就是这么简单;
blockquote
但是在打字稿中,我收到错误......
类型的参数' {blockquote:(quote:string)=>串; }'不能分配给' MarkedRenderer'类型的参数。财产代码'类型' {blockquote :( quote:string)=>串; }'
这对我来说似乎有点混乱,但我认为这意味着我需要使用$markedProvider.setRenderer({
blockquote:(quote: string): string => {
return 'customized output';
}
});
关键字创建新的渲染器。
所以我试试......
var r = new marked.Renderer();
我告诉它并不存在。即使new
库明显导入并正常工作。
我最终"强迫"这可以通过创建一个新的接口来设置每个函数都是可选的,就像这样;
marked.js
但我真的想了解并达成更有机的解决方案。任何人都可以帮忙吗?
答案 0 :(得分:1)
将IMarkedRenderer
的所有字段标记为可选的修正是正确的,将setRenderer
方法添加到MarkedStatic
根据repo中的文档,您看起来不应该在任何地方添加new
。您需要的实例已经由DI注射器提供,应该足够了。
答案 1 :(得分:1)
我更喜欢你的解决方案,但如果你有一个mixin函数和一个默认渲染器的引用,你可以试试这样的东西:
let mixin : <A,B>(a: A, b: B) => A & B;
interface IMarkdownProvider {
setRenderer?(renderer?: IMarkedRenderer);
}
interface IMarkedRenderer {
code(code: string, language: string): string;
br(): string;
del(text: string): string;
}
let provider: IMarkdownProvider;
let defaultRenderer = <IMarkedRenderer>{};
provider.setRenderer(mixin(defaultRenderer, {br: () => "br"}));