带有必需参数的打字稿解构
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.
时,它会变得更清晰
编辑 抱歉,我的问题有点不清楚。我想强制执行始终需要 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.
时,它会变得更清晰