Как можно улучшить эту типизацию?
Имеется следующий тип:
export type Country = {
name: 'USA' | 'Russia' | 'Bulgaria' | 'Romania' | 'Austria' | 'Great Britain' | 'Italy',
code: 'us' | 'ru' | 'bg' | 'ro' | 'au' | 'gb' | 'it'
};
Однако при его использовании можно создать объект с любыми перечисленными name и code, например:
{ name: USA, code: 'ru'}
Понятное дело, что так не годится. Как сделать связанные значения name и code?
Ответы (1 шт):
Автор решения: qwabra
→ Ссылка
TEST: {
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' };
// -,-
<$country>{ name: 'Italy', code: 'it' }; // ok
// <$country>{ name: 'Great Britain', code: 'ro' }; // TypeError
}
TEST: {
const COUNTRY = {
'USA': 'us',
'Russia': 'ru',
'Bulgaria': 'bg',
'Romania': 'ro',
'Austria': 'au',
'Great Britain': 'gb',
'Italy': 'it',
} as const
// - ,-
type $country = typeof COUNTRY
// -, -
const us: $country['USA'] = 'us' // ok
// const ro: $country['Romania'] = 'us' // TypeError
// -, -
// - ,-
const gb = COUNTRY['Great Britain'] // const gb: "gb"
}
доки: