Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 打字脚本将定义与“混淆”;新的();及建造商_Typescript - Fatal编程技术网

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”}));