使用 class 的方法在打字稿中创建联合类型
create a union type in typescript with methods of a class
我正在查看一些遗留代码,他们将所有 redux reducer 创建为 class:
的实例方法
@Injectable()
export class PeopleActions {
constructor(private ngRedux: NgRedux<any>) {}
add() {
this.ngRedux.dispatch({ADD, payload: {foo: 'bar;});
}
remove() {
this.ngRedux.dispatch({Remove, payload: {foo: 'bar;});
}
// etc.
我通常会将它们创建为单独的函数
export function add { // etc.}
export function remove { // etc.}
然后创建联合:
type MyActions = add | remove;
我能否以某种方式创建 class 实例方法的联合?
如果您想要所有键的联合,您可以使用 keyof
type MyActions = keyof PeopleActions; // "add" | "remove"
如果 class 也有 public 字段不是方法,而您想过滤掉它们,您可以使用条件类型:
type ExtractFunctionKeys<T> = { [P in keyof T]-?: T[P] extends Function ? P : never}[keyof T]
type MyActions = ExtractFunctionKeys<PeopleActions>; // "add" | "remove"
我正在查看一些遗留代码,他们将所有 redux reducer 创建为 class:
的实例方法@Injectable()
export class PeopleActions {
constructor(private ngRedux: NgRedux<any>) {}
add() {
this.ngRedux.dispatch({ADD, payload: {foo: 'bar;});
}
remove() {
this.ngRedux.dispatch({Remove, payload: {foo: 'bar;});
}
// etc.
我通常会将它们创建为单独的函数
export function add { // etc.}
export function remove { // etc.}
然后创建联合:
type MyActions = add | remove;
我能否以某种方式创建 class 实例方法的联合?
如果您想要所有键的联合,您可以使用 keyof
type MyActions = keyof PeopleActions; // "add" | "remove"
如果 class 也有 public 字段不是方法,而您想过滤掉它们,您可以使用条件类型:
type ExtractFunctionKeys<T> = { [P in keyof T]-?: T[P] extends Function ? P : never}[keyof T]
type MyActions = ExtractFunctionKeys<PeopleActions>; // "add" | "remove"