Typescript 打字脚本将定义与“混淆”;新的();及建造商
我正试图通过一个名为Typescript 打字脚本将定义与“混淆”;新的();及建造商,typescript,Typescript,我正试图通过一个名为angular-marked的plugin,在Typescript应用程序中使用一个名为marked的流行javascript库 标记的上有一个.d.ts文件,所以我将其包括在内 现在的问题是,angular-marked有一个名为setRenderer的新函数,它接受一个应该与marked.Renderer匹配的对象文本。这在普通javascript中不是问题 setRenderer未在typescript定义中定义,但MarkedRenderer是,它(理论上)是通过
angular-marked
的plugin,在Typescript
应用程序中使用一个名为marked
的流行javascript库
标记的
上有一个.d.ts
文件,所以我将其包括在内
现在的问题是,angular-marked
有一个名为setRenderer
的新函数,它接受一个应该与marked.Renderer
匹配的对象文本。这在普通javascript中不是问题
setRenderer
未在typescript定义中定义,但MarkedRenderer
是,它(理论上)是通过函数的参数类型。所以我试着制作自己的接口来声明它,就像这样
interface MarkedStatic {
setRenderer(renderer: MarkedRenderer): MarkedStatic;
}
这似乎很简单。但是当我尝试使用它时,我得到了各种各样的废话。例如,我想简单地覆盖它输出blockquote
的方式。在普通javascript中,就是这么简单
$markedProvider.setRenderer({
blockquote:(quote: string): string => {
return 'customized output';
}
});
但是在typescript中,我得到了错误
类型为“{blockquote:(quote:string)=>string;}”的参数不能分配给类型为“MarkedRenderer”的参数。类型“{blockquote:(quote:string)=>string;}”中缺少属性“code”
这似乎有点让我困惑,但我认为这意味着我需要使用new
关键字创建一个新的渲染器
所以我试着
var r=新标记的.Renderer()
我听说它不存在。即使使用标记的.js
库,也可以清楚地导入并工作
我最终通过创建一个新的接口“强迫”它工作,该接口将每个函数设置为可选的,如下所示
interface IMarkdownProvider extends MarkedStatic {
setRenderer?(renderer?: IMarkedRenderer);
}
interface IMarkedRenderer {
code?(code: string, language: string): string;
blockquote?(quote: string): string;
html?(html: string): string;
heading?(text: string, level: number, raw: string): string;
hr?(): string;
list?(body: string, ordered: boolean): string;
listitem?(text: string): string;
paragraph?(text: string): string;
table?(header: string, body: string): string;
tablerow?(content: string): string;
tablecell?(content: string, flags: {
header: boolean,
align: string
}): string;
strong?(text: string): string;
em?(text: string): string;
codespan?(code: string): string;
br?(): string;
del?(text: string): string;
link?(href: string, title: string, text: string): string;
image?(href: string, title: string, text: string): string;
text?(text: string): string;
}
但我真的很想了解并达成一个更有机的解决方案。有人能帮上忙吗?您将IMarkedRenderer
的所有字段标记为可选的修复程序是正确的,您将另一个setRenderer
方法添加到MarkedStatic
根据回购协议中的文档,您似乎不应该在任何地方添加new
。DI注入器已经提供了您所需的实例,应该足够了。将IMarkedRenderer
的所有字段标记为可选的修复程序是正确的,将附加的setRenderer
方法添加到MarkedStatic
根据回购协议中的文档,您似乎不应该在任何地方添加new
。您所需的实例已经由DI注入器提供,应该足够了。我更喜欢您的解决方案,但如果您有一个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"}));
让mixin:(a:a,b:b)=>a&b;
接口IMarkdownProvider{
setRenderer?(渲染器?:IMarkedRenderer);
}
接口IMarkedRenderer{
代码(代码:字符串,语言:字符串):字符串;
br():字符串;
del(文本:字符串):字符串;
}
let provider:IMarkdownProvider;
设defaultRenderer={};
setRenderer(mixin(defaultRenderer,{br:()=>“br”}));
我更喜欢您的解决方案,但如果您有可用的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"}));
让mixin:(a:a,b:b)=>a&b;
接口IMarkdownProvider{
setRenderer?(渲染器?:IMarkedRenderer);
}
接口IMarkedRenderer{
代码(代码:字符串,语言:字符串):字符串;
br():字符串;
del(文本:字符串):字符串;
}
let provider:IMarkdownProvider;
设defaultRenderer={};
setRenderer(mixin(defaultRenderer,{br:()=>“br”}));