Javascript 如何基于对象中的值限制对象类型?

Javascript 如何基于对象中的值限制对象类型?,javascript,typescript,Javascript,Typescript,目前我使用的是这种类型的别名: export type Country = { name: 'USA' | 'Russia' | 'Bulgaria' | 'Romania' | 'Austria' | 'Great Britain' | 'Italy', code: 'us' | 'ru' | 'bg' | 'ro' | 'au' | 'gb' | 'it' }; 但它允许创建不正确的对象: { name: 'USA', code: 'ru'} 出于此目的,创建类型的最佳方法是什么

目前我使用的是这种类型的别名:

export type Country = {
  name: 'USA' | 'Russia' | 'Bulgaria' | 'Romania' | 'Austria' | 'Great Britain' | 'Italy',
  code: 'us' | 'ru' | 'bg' | 'ro' | 'au' | 'gb' | 'it'
};
但它允许创建不正确的对象:

{ name: 'USA', code: 'ru'}

出于此目的,创建类型的最佳方法是什么?

您可以使用有区别的联合方法:

type Country = {
    name: 'USA',
    code: 'us',
} | {
    name: 'Russia',
    code: 'ru',
} | {
    name: 'Bulgaria',
    code: 'bg',
} | {
    name: 'Romania',
    code: 'ro',
} | {
    name: 'Austria',
    code: 'au',
} | {
    name: 'Great Britain',
    code: 'gb',   
} | {
    name: 'Italy',
    code: 'it',   
};

// works
const myCountry: Country = {
    name: 'USA',
    code: 'us',
};

// does not
const myCountry2: Country = {
    name: 'USA',
    code: 'ru',
};
更多阅读

您也可以使用paramater映射,但必须在接口上指定paramater:

type CountryMap = {
    USA: 'us',
    Russia: 'ru',
    Bulgaria: 'bg',
    Romania: 'ro',
    Austria: 'au',
    'Great Britain': 'gb',
    Italy: 'it',
};

interface ICountry<T extends keyof CountryMap> {
    name: T;
    code: CountryMap[T];
}

// works
const myICountry: ICountry<'USA'> = {
    name: 'USA',
    code: 'us'
};

// does not
const myICountry2: ICountry<'USA'> = {
    name: 'USA',
    code: 'ru',
};
type CountryMap={
美国:“美国”,
俄罗斯:"鲁",,
保加利亚:“bg”,
罗马尼亚:"罗",,
奥地利:“非盟”,
“大不列颠”:“gb”,
意大利:"它",,
};
接口国家{
姓名:T;
代码:CountryMap[T];
}
//工作
常量myICountry:ICountry={
名称:'美国',
代码:“美国”
};
//不
常量myICountry2:ICountry={
名称:'美国',
代码:‘ru’,
};

这两个示例都使用typescript,这不利于手动构造此类类型。提供单一类型的法院代码定义(您已经获得),并附带导出的
CountryCode->CountryName
类型的函数。您可能需要一些定义命名策略的其他参数(本地化、短/全名等)