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> = {