gpt4 book ai didi

typescript - 你能提取一个类中所有方法的签名吗?

转载 作者:行者123 更新时间:2023-12-04 10:55:41 25 4
gpt4 key购买 nike

假设我有这门课:

class Actions {
static FooAction = 'foo' as const;
someAction1() {
return {
type: Actions.FooAction,
payload: {a: 1, b:2}
}}

static BarAction = 'bar' as const;
someAction2() {
return {
type: Actions.BarAction,
payload: {c: 3, e:2}
}}
... keeps going ...
}

所有的类方法都返回一个类似的对象: {type: string, payload: Record<string, number>}
但是,我想更严格。我希望它是
type ReturnedActions = 
| { type: 'foo', {a: string, b:string} }
| { type: 'bar', {c: string, e:string} }
...

因为我可以使用开关按类型过滤:
declare var a: ReturnedActions 

switch (a.type) {
case 'foo':
payload.c // error
}

我知道我可以
var actions = new Actions(); 
type = ReturnType<typeof actions.someAction1> | ReturnType<typeof actions.someAction2>

然而,这个类有数百行。有没有办法在不手动执行的情况下从类中的所有方法中提取所有可能的返回值?

我正在使用版本“ typescript ”:“3.7.2”

最佳答案

您可以使用映射类型来检查类的属性,并使用条件类型来过滤方法并提取返回类型。然后你索引这个映射类型以获得映射类型中所有可能值的联合

type ReturnedActions<T> = {
[P in keyof T]: T[P] extends (...a: any) => infer R ? {
type: P,
payload: R
} : never
}[keyof T]

type AllActions = ReturnedActions<Actions>


Playground link

编辑
Actions只包含函数,你也可以使用 ReturnType 的分布式特性获取 Actions中所有函数的返回类型:
type AllActions = ReturnType<Actions[keyof Actions]>;

关于typescript - 你能提取一个类中所有方法的签名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59219954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com