首页 > 解决方案 > 打字稿类型检查基于第一选择的方法第二个参数

问题描述

看看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'

我正在寻找最合适的方式来键入此方法。即使这意味着撤消上述示例代码的任何部分

这是我认为可能有用的东西。

我对打字稿很陌生。先感谢您。

标签: typescript

解决方案


注意:这个问题回答了问题的原始修订

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")

您甚至可以更进一步,并推断出SDKModulesfrom的类型moduleMethods

type SDKModules = keyof typeof moduleMethods;

以便该moduleMethods对象成为您的唯一真理来源。

游乐场链接


推荐阅读