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
类型的函数。您可能需要一些定义命名策略的其他参数(本地化、短/全名等)