具有必需参数的打字稿解构

时间:2019-08-23 23:34:21

标签: javascript typescript object ecmascript-6 destructuring

编辑抱歉,我的问题有点不清楚。我要强制始终要求getList参数。所以我没有默认值。例如,我希望用户始终提供一个获取列表

我正在尝试创建一个具有一些可选参数和一些必需参数的构造器

export class PageConfig {
    constructor({
        isSliding = false,
    }: {
        isSliding?: boolean
        getList: (pagingInfo: PagingInfo) => Observable<any>
    } = {  }) { }
}

执行此操作时出现错误

  

类型“ {}”中缺少getList,但类型...中必需。

我希望能够在像这样的类中使用它:

class UsersPage {

    config = new pageConfig({ this.getList })    

    getList(pagingInfo: PagingInfo) {
      // do work...
    }
}

注意::我已为该示例简化了类,但我拥有更多的属性,我想利用解构方法,因此无需配置其他类的实例化比声明中的

如何强制销毁过程中必须传递getList?

3 个答案:

答案 0 :(得分:5)

您对PageConfig构造函数参数使用了默认值{},但是您在类型中将getList标记为必需。如果我对您的理解正确,则希望设置构造函数参数,并且始终设置getList,因此将代码更改为:

export class PageConfig {
  constructor({
    getList,
    isSliding = false
  }: {
    getList: (pagingInfo: PagingInfo) => Observable<any>;
    isSliding?: boolean;
  }) {
    … // use getList and isSliding
  }
}

这种语法(使用默认值进行销毁)有时会有点麻烦。当您extract the constructor argument type时,它会变得更加清晰。

TypeScript docs example

答案 1 :(得分:3)

您要删除默认值,并且还要更改参数顺序-必需参数始终位于可选参数之前:

constructor(getList: (pagingInfo: PagingInfo) => Observable<any>, isSliding?: boolean = false) {...}

答案 2 :(得分:2)

如果所有构造函数参数都是可选的/具有默认值,则可以选择一个选项,简单地是在构造函数中使用Partial config并与默认值合并,例如

interface IPageConfigConstructor {
  isSliding: boolean;
  getList: (pagingInfo) => Observable<any>;
}
const DEFAULT_CONFIG:IPageConfigConstructor = {
  isSliding: true,
  getList: (pagingInfo) => null
}

class PageConfig {
  constructor(config: Partial<IPageConfigConstructor>) {
    const mergedConfig:IPageConfigConstructor = {...DEFAULT_CONFIG,...config}
  }
}

class UsersPage {
  config = new PageConfig({getList:(pagingInfo)=>this.getList(pagingInfo)});

  getList(pagingInfo) {
    // do work...
    return new Observable
  }
}