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

Typescript destructuring with required parameter

编辑 抱歉,我的问题有点不清楚。我想强制执行始终需要 getList 参数。所以我没有它的默认值。例如,我希望用户始终提供一个 getlist

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

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

当我执行此操作时出现错误

getList is missing in type '{}' but required in type ...

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

class UsersPage {

    config = new pageConfig({ this.getList })    

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

注意: 我已经简化了这个例子的 class 但我有更多的属性,我想利用解构,所以我不必须配置我的 classes 的实例化而不是来自声明

如何强制在解构过程中必须传递 getList?

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

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

如果所有构造函数参数都是 optional/have 默认值,一个选项是简单地在构造函数中使用部分配置并与默认值合并,例如

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
  }
}

您为 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