typescript - Definiera nästlade egenskaper via TS


ha ett sådant objekt:

const countrySize = {
  "af":{
     "name":"Afghanistan",
     "shoeSizeLocale":"EU/IT"
  },
  "al":{
     "name":"Albania",
     "shoeSizeLocale":"AU"
  },
  "dz":{
     "name":"Algeria",
     "shoeSizeLocale":"EU/IT"
  },
  "ar":{
     "name":"Argentina",
     "shoeSizeLocale":"US/CA"
  },
  ...
}

hur kan jag få typen av shoeSizeLocale att bli så här: type ShoeLocale="EU/IT" | "US/CA" | "AU"

Jag försökte göra så

type CountryCodes = typeof countrySize;
type CountryCodesKeys = keyof CountryCodes;
type ShoeLocale = CountryCodes[CountryCodesKeys]["name"];

men det fungerar inte. Typen i det här fallet är string

Svar #1

Du bör bara lägga till as const-påståendet för att låta TypeScript veta att objektet inte kommer att förändras:

const countrySize = {
  af: {
    name: 'Afghanistan',
    shoeSizeLocale: 'EU/IT',
  },
  al: {
    name: 'Albania',
    shoeSizeLocale: 'AU',
  },
  dz: {
    name: 'Algeria',
    shoeSizeLocale: 'EU/IT',
  },
  ar: {
    name: 'Argentina',
    shoeSizeLocale: 'US/CA',
  },
} as const;

Då kommer dina typer att vara som förväntat. Och för att lägga till type ShoeSizeLocale="EU/IT" | "US/CA" | "AU" kan du bara göra följande:

type ShoeSizeLocal = CountryCodes[CountryCodesKeys]['shoeSizeLocale'];

lekplats