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
