Typescript, как создавать вложенные объекты интерфейса, используя сопоставленные типы? - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу получить данные, которые будут выглядеть следующим образом

paymentProviderByCountry = {
    England: worldPay,
    Spain: worldPay
}

Как создать интерфейс для paymentProviderByCountryObj, который объединяет paymentProvidersList и countryList в желаемом динамическом формате.

Я думаю, что я ищу, как я могу рекурсивно создать объект

    enum paymentProvidersList {
    WorldPay,
    Paypal,
}
enum countryListEnum {
    England,
    France,
    Spain,
}

type T0 = { [key in paymentProvidersList]: string }; // This would work

/*
  I want the values on paymentProviderByCountryObj to be dynamic based on the
   enum values so that i can have an object that looks like this

  paymentProviderByCountry = {
    England: WorldPay,
    Spain: Paypal,
    France: WorldPay
}
*/
interface paymentProviderByCountryObj {
    // This is the complex case, i cant get the index of the class to be dynamic and also its value
    [key in countryListEnum] :string : { [key in paymentProvidersList]: string }; 
}

export interface sysConfigInterface {
    paymentProviders: paymentProvidersList,
    paymentProviderByCountry: paymentProviderByCountryObj,
    minPaymentThreshold: String,
}

Пример ссылки

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Это то, что в конечном итоге сработало для моей конечной цели

enum paymentProvidersList {
        WorldPay,
        Paypal,
    }
    enum countryListEnum {
        England,
        France,
        Spain,
    }

    // Or Record<countryListEnum, paymentProvidersList>
    type paymentProviderByCountryObj = { [k in countryListEnum]: paymentProvidersList } 

    const paymentProviderByCountry: paymentProviderByCountryObj = {
        [countryListEnum.England]: paymentProvidersList.WorldPay,
        [countryListEnum.France]: paymentProvidersList.WorldPay,
        [countryListEnum.Spain]: paymentProvidersList.Paypal
    }
0 голосов
/ 03 сентября 2018

Вы ищете in (введено в TypeScript 2.1 как часть Mapped Types )

{ [key in countryList]: paymentProvidersList }

Или, если вы не хотите проходить каждую страну:

{ [key in countryList]?: paymentProvidersList }
...