typescript - 打字稿类型检查基于第一选择的方法第二个参数
问题描述
看看request
这个类中方法的参数
export type SDKmodules = 'orders' |'pricing' |'catalogV2' |'catalog' |'prodType' |'reports' |'listings';
export class SellerAPI {
request(mod: SDKmodules, method: string, params: any = {}) {
return this.http.get<any>( `/sp-sdk/${mod}/${method}`, { params });
}
}
我正在尝试request
根据所选模块键入参数。每个模块都是一个类。这是一个简化的俯视图。
{
orders: ['getOrder', 'getOrderExt', 'getOrderItems', 'saveOrders'],
pricing: ["getCompetitivePricing", "getItemOffers", "getListingOffers", "getPricing"],
catalogV2: ["getCatalogItem", "searchCatalogItems", "getCatalogProdType"],
}
所以如果模块选择是orders
唯一可以接受的method
就是......
'getOrder', 'getOrderExt', 'getOrderItems', 'saveOrders'
我正在寻找最合适的方式来键入此方法。即使这意味着撤消上述示例代码的任何部分。
这是我认为可能有用的东西。
- 请求方法的多个重载
- 因为所有的“模块” (参数)都是类对象。有没有办法使用它们自己的模块来输入这个方法?
我对打字稿很陌生。先感谢您。
解决方案
注意:这个问题回答了问题的原始修订
moduleMethods
这是通过从具有const
断言的常量(定义如下)中提取类型来实现的一种方法:
export type SDKmodules = 'orders' | 'pricing' | 'catalogV2';
// | 'catalog' | 'prodType' | 'reports' | 'listings';
const moduleMethods = {
orders: [
'getOrder', 'getOrderExt', 'getOrderItems', 'saveOrders'],
pricing: [
"getCompetitivePricing", "getItemOffers", "getListingOffers", "getPricing"],
catalogV2: [
"getCatalogItem", "searchCatalogItems", "getCatalogProdType"],
} as const;
type OrderType<T extends SDKmodules> = (typeof moduleMethods)[T][number]
export class SellerAPI {
request<T extends SDKmodules>(mod: T, method: OrderType<T>, params: any = {}) {
return console.log(`/sp-sdk/${mod}/${method}`, { params });
}
}
const api = new SellerAPI()
api.request("orders", "getOrderItems")
您甚至可以更进一步,并推断出SDKModules
from的类型moduleMethods
:
type SDKModules = keyof typeof moduleMethods;
以便该moduleMethods
对象成为您的唯一真理来源。
推荐阅读
- google-cloud-platform - 使用 gcloud 工具时,我可以在 Google Cloud Speech-to-Text api 中指定模型(例如“视频”)吗?
- r - case_when 在一个实例中起作用,而不是在另一个实例中
- ruby-on-rails - Rails:“浅层”选项究竟对我们有什么好处?
- ios - 使用 sentry-expo 发送自定义 iOS 原生错误
- python - 如何比较两个 NewsItem 列表并减去相同的 NewsItem?
- python - AttributeError:“模块”对象在脚本中没有属性“_Condition”
- google-apps-script - 检索 Google 电子表格中所有表格的值以进行特定修订
- c++ - 'std::bad_alloc' 尝试删除 priority_queue 元素 C++
- r - 对大量图像文件进行分类
- python - Python使用正则表达式删除文本中的标点符号