简体   繁体   English

Typescript如何使用映射类型创建嵌套的接口对象?

[英]Typescript how to create a nested interface objects using mapped types?

I want to have data that would be as follow 我想要的数据如下

paymentProviderByCountry = {
    England: worldPay,
    Spain: worldPay
}

How do I create the interface for paymentProviderByCountryObj that integrates paymentProvidersList and countryList in my desired dynamic format. 如何为paymentProviderByCountryObj创建接口,该接口以所需的动态格式集成了paymentProvidersListcountryList

I guess what I am looking for is how do I create recursively the obj 我猜我正在寻找的是如何递归创建obj

    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,
}

The Example Link 示例链接

You're looking for in (introduced in TypeScript 2.1 as part of Mapped Types ) 您正在寻找in (以打字稿2.1引入的一部分映射类型

{ [key in countryList]: paymentProvidersList }

Or, in case you don't want to have to pass every country: 或者,如果您不想通过每个国家/地区:

{ [key in countryList]?: paymentProvidersList }

This is what ultimately worked for my end goal 这才是最终目标

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
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM