Generera returtyp dynamiskt baserat på parameter i TypeScript


Jag har en funktion som tar emot en array av strängar och returnerar ett objekt vars nycklar är strängarna och varje värde är undefined:

function getInitialCharacteristics(names: string[]): ??? {
  return names.reduce((obj, name) => ({ ...obj, [name]: undefined }), {});
}

Exempel på användning:

const result = getInitialCharacteristics(["hello", "world"]);
// result == { hello: undefined, world: undefined }

Nu undrar jag hur jag kan definiera rätt returvärde för getInitialCharacteristics med TypeScript. Jag skulle behöva använda generics eller på något sätt dynamiskt generera den typen. Är det möjligt?

Svar #1

Om du kommer att kalla denna funktion med konstanter eller strängliteraler kan TypeScript hjälpa dig att få en striktare typ för returobjektet

function getInitialCharacteristics<T extends string>(names: T[]): Record<T, undefined>
function getInitialCharacteristics(names: string[]): Record<string, undefined> {
  return names.reduce((obj, name) => ({ ...obj, [name]: undefined }), {});
}

const result = getInitialCharacteristics(["hello", "world"]);
result.hello //ok
result.world //ok
result.helloo //err

Lekplatslänk

Relaterade artiklar