Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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
将JavaScript类与TypeScript声明文件混合使用_Javascript_Typescript_Mixins_.d.ts - Fatal编程技术网

将JavaScript类与TypeScript声明文件混合使用

将JavaScript类与TypeScript声明文件混合使用,javascript,typescript,mixins,.d.ts,Javascript,Typescript,Mixins,.d.ts,我需要在声明文件中使用类mixin的帮助。具体来说,当在mixin中定义方法时,typescript不会在混合类主体中拾取该方法: 在我的例子中,我应用了两个mixin。第一个mixin-NotifyingElementMixin-提供了一个名为notify的方法,该方法无法应用于混合类主体 notifying-element-mixin.js export const NotifyingElementMixin=superclass=> 类NotifyingElement扩展了超类{ /**

我需要在声明文件中使用类mixin的帮助。具体来说,当在mixin中定义方法时,typescript不会在混合类主体中拾取该方法:

在我的例子中,我应用了两个mixin。第一个mixin-
NotifyingElementMixin
-提供了一个名为
notify
的方法,该方法无法应用于混合类主体

notifying-element-mixin.js
export const NotifyingElementMixin=superclass=>
类NotifyingElement扩展了超类{
/**
*激发一个`*-changed`事件。
*
*@param{string}propName属性的名称。
*@param{any}value属性值
*@受保护
*/
通知(名称、值){
这就是dispatchEvent(
新的CustomEvent(`${propName}-已更改`{
详细信息:{value},
})
);
}
};
};
通知-element-mixin.d.ts
导出声明类NotifyingElement{
public notify(propName:string,value:any):void
}
导出函数NotifyingElementMixin
(超类:TBase):TBase&NotifyingElement;
第二个mixin提供了其他属性和方法,但出于这个问题,我简化了实现

apollo-query-mixin.js
导出常量ApolloQueryMixin=
超类=>class扩展了超类{
数据=空;
is='Query';
};
apollo-query-mixin.d.ts
导出声明类查询{
数据:空
是:字符串
}
类型构造函数=new(…参数:any[])=>T;
导出函数ApolloQueryMixin
(超类:TBase):ApolloQuery&TBase;
最后,我想导出一个类,该类同时应用mixin并提供自己的方法。这就是我遇到麻烦的地方

apollo-query.js ApolloQuery类扩展了NotifyingElementMixin(ApolloQueryMixin(HtmleElement)){ /** *最新数据。 */ 获取数据(){ 返回此数据; } 设置数据(值){ 这是。\ u数据=值; 此。通知('数据',值); } //等 } 阿波罗-d.ts
从“/apollo query mixin”导入{apollo querymixin};
从“/notifying element mixin”导入{notifyingelement mixin}”;
导出声明类查询
扩展NotifyingElementMixin(ApolloQueryMixin(HtmleElement)){}
编译此文件或使用IDE时,我收到错误:

error TS2339: Property 'notify' does not exist on type 'ApolloQuery'.

如何欺骗typescript在混合类主体中提取继承的方法?

这是我使用的混合模式,我认为关键是返回构造函数:

import { LitElement, property } from "lit-element";

type Constructor = new (...args: any[]) => LitElement;

interface BeforeRenderMixin {
  beforeRenderComplete: Boolean;
}

type ReturnConstructor = new (...args: any[]) => LitElement & BeforeRenderMixin;

export default function<B extends Constructor>(Base: B): B & ReturnConstructor {
  class Mixin extends Base implements BeforeRenderMixin {
    @property({ type: Boolean })
    public beforeRenderComplete: boolean = false;

    public connectedCallback() {
      super.connectedCallback();
      if (!this.beforeRenderComplete)
        this.beforeRender().then(() => (this.beforeRenderComplete = true));
    }

    public async beforeRender() {
      return;
    }

    public shouldUpdate(changedProperties: any) {
      return this.beforeRenderComplete && super.shouldUpdate(changedProperties);
    }
  }

  return Mixin;
}
从“lit元素”导入{LitElement,property};
类型构造函数=new(…参数:any[])=>LitElement;
RenderMixin之前的接口{
beforeRenderComplete:布尔值;
}
键入ReturnConstructor=new(…args:any[])=>LitElement&BeforeRenderMixin;
导出默认函数(基:B):B&ReturnConstructor{
类Mixin扩展了RenderMixin之前的基本实现{
@属性({type:Boolean})
public beforeRenderComplete:boolean=false;
公共connectedCallback(){
super.connectedCallback();
如果(!this.beforeRenderComplete)
this.beforeRender().then(()=>(this.beforeRenderComplete=true));
}
public async beforeRender(){
返回;
}
公共应更新(更改属性:任何){
返回this.beforeRenderComplete&&super.shouldUpdate(changedProperties);
}
}
返混;
}
由此产生:

import { LitElement } from "lit-element";
declare type Constructor = new (...args: any[]) => LitElement;
interface BeforeRenderMixin {
    beforeRenderComplete: Boolean;
}
declare type ReturnConstructor = new (...args: any[]) => LitElement & BeforeRenderMixin;
export default function <B extends Constructor>(Base: B): B & ReturnConstructor;
export {};
从“lit元素”导入{LitElement};
声明类型构造函数=new(…args:any[])=>LitElement;
RenderMixin之前的接口{
beforeRenderComplete:布尔值;
}
declare type ReturnConstructor=new(…参数:any[])=>LitElement&BeforeRenderMixin;
导出默认函数(基:B):B&ReturnConstructor;
出口{};

这对于使用类来获取mixin方法非常有效,但是在mixin类的主体中,我不会从超类中获取类型,也就是说,如果我将
传递给一个需要HtmleElement的函数,我得到的
类型为“this”的参数不可分配给类型为“HTMLElement”的参数。
我将为此提出另一个问题这是后续问题: