typescript - keyof returnerer ikke riktig type når det brukes med Record
Jeg har en liste over land i et objekt
const CountryCodes = {
DE: {
countryCode: 'DE',
countryName: 'Deutschland',
phoneCode: 49,
},
US: {
countryCode: 'US',
countryName: 'United States',
phoneCode: 1,
},
...
}
Og et grensesnitt for innholdet
type CountryCode = {
countryCode: string;
countryName: string;
phoneCode: number;
};
Hvis jeg ikke gir en type til CountryCodes og henter nøklene dens med keyof typeof CountryCodes, returnerer det det riktige resultatet som er 'DE' | 'US' ...
Men hvis jeg ikke gir en type, kan det oppstå feil i dette objektet, noen kan legge til/trekke fra et element. Så jeg vil strengt typsette CountryCodes-objektet med CountryCode-type.
const CountryCodes: Record<string, CountryCode> = { ...
Men med denne typen er resultatet av keyof typeof CountryCodes nå bare string som angitt i Record<string, CountryCode>
Finnes det en måte hvor jeg kan strengt typisere dette objektet og fortsatt få nøklene til landene med keyof?
Svar #1
Her er en måte, hvor dataene først legges i en midlertidig variabel som deretter tildeles riktig variabel og "omgjøres" til ønsket type:
const _CountryCodes = {
DE: {
countryCode: 'DE',
countryName: 'Deutschland',
phoneCode: 49,
},
US: {
countryCode: 'US',
countryName: 'United States',
phoneCode: 1,
},
}
const CountryCodes: Record<keyof typeof _CountryCodes, CountryCode> = _CountryCodes;
Svar #2
Du kan hardkode de gyldige nøklene:
type CountryKey = 'DE' | 'US';
const CountryCodes: Record<CountryKey, CountryCode> = {
