Рич*_*ман 3 javascript typescript
现在我使用这个类型别名:
export type Country = {
name: 'USA' | 'Russia' | 'Bulgaria' | 'Romania' | 'Austria' | 'Great Britain' | 'Italy',
code: 'us' | 'ru' | 'bg' | 'ro' | 'au' | 'gb' | 'it'
};
Run Code Online (Sandbox Code Playgroud)
但它允许创建不正确的对象:
{ name: 'USA', code: 'ru'}
Run Code Online (Sandbox Code Playgroud)
为此目的制作类型的最佳方法是什么?
您可以使用有区别的联合方法:
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',
};
Run Code Online (Sandbox Code Playgroud)
更多阅读在这里
您也可以使用参数映射,但是您必须在界面上指定参数:
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',
};
Run Code Online (Sandbox Code Playgroud)
此处为这两个示例工作的打字稿游乐场