gpt4 book ai didi

reactjs - 以类型作为参数的通用 TypeScript API

转载 作者:行者123 更新时间:2023-12-05 03:22:38 24 4
gpt4 key购买 nike

假设我有两个这样的函数(我目前有 20 个不同的函数看起来几乎相同。唯一的区别是路由和 DTO)我不想在函数调用中发送路由和 DTO 作为这会使函数调用更加困惑/复杂。所以我宁愿只用 Asset | 来调用它。人员 |其他有效的东西

 async getAllAssets() {
return await this.get<AssetDto[]>('assets/assets')
}

async getAllPersonnels() {
return await this.get<PersonnelDto[]>('personnel/personnels')
}

而且我想让它更通用,所以我只需要一个函数而不是两个。我该如何实现?我自己的尝试如下。也许它也会让我更清楚我真正想要的是什么。我是 TypeScript 的新手,只用了一个星期。我的“梦想”实现也将包括枚举,这样我就可以调用函数,例如Entity.Asset 或 Entity.Personnel,然后在引擎盖下它知道它应该为 Asset 或 Personnel 使用路由和 dto。

export type Asset = {
route: '/assets/asset',
dto: AssetDto[]
}

export type Personnel = {
route: '/personnel/personnel',
dto: PersonnelDto[]
}

export type Entity = Asset | Personnel

这里是一个更通用的函数的例子:

 async getAll<T extends Entity>(entity: T) {
return await this.get<typeof entity.Dto>(entity.route)
}

但我不知道如何实际调用具有类型的函数?或者甚至可以这样做吗?

  async howIWantAFunctionCallToBeLike() {
await this.getAll(Entity.Asset))
}

最佳答案

正如 Tobias 所说,您需要一些东西在运行时存活下来以传递给您的通用函数。我推荐使用一个简单的泛型类:

class Route<T> {
constructor(readonly path: string) {
}

transform(data: unknown): T[] {
// unsafe cast by default; subclasses could do something more
return data as T[];
}
}

const personnelRoute = new Route<PersonnelDto>('/personnel/personnel');

async function getAll<T>(route: Route<T>): Promise<T[]> {
return route.transform(await doFetch(route.path));
}

关于reactjs - 以类型作为参数的通用 TypeScript API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72673057/

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