typescript - Hvordan lage din egen type basert på funksjonsparametere?


La oss si at det finnes en funksjon for å lage et objekt.

interface Params {
  name: string
}

const createTypedObject = (params: Params) => ({
  [params.name]: 1,
})

Jeg lager et objekt

const obj = createTypedObject({ name: 'test' })
// Type obj {[p: string]: number}

Hvordan få objekttypen til å være {test: number}?

Svar #1

TypeScript er ikke så bra til å utlede generiske typer fra opprettede objekter, så du må bruke en typepåstand:

const createTypedObject = <P extends Params>(params: P) => ({
  [params.name]: 1,
}) as {[K in P['name']]: number}

Merk også at typen til objektlitteralen {name: 'test'} er {name: string}, så for å få riktig innsnevret egenskapstype, må du legge til as const til parameteren:

const obj = createTypedObject({name: 'test'} as const)
// obj: {test: number}

Alternativt kan du gjøre params skrivebeskyttet, noe som lar TypeScript slutte seg til den innsnevrede typen for litterale objekter, selv uten as const:

const createTypedObject = <P extends Params>(params: Readonly<P>) => ({
  [params.name]: 1,
}) as {[K in P['name']]: number}

const obj = createTypedObject({name: 'test'})
//    obj: {test: number}

TypeScript-lekeplass

Relaterte artikler