Typescript: Valfri parameter i funktion, beroende på att unionstyp har egenskap


Jag har en unionstyp:

type Msg = { type: 'banana', value: number[] } | { type: 'apple' };

nu skulle jag vilja skapa en funktion som skapar en sådan Frukt-typ, med två argument och tar en generisk för Msg:

const createMsg = <M extends { type: string }>(type: M["type"], value?: M["value"]) => ({ type, value });

Argumentet value för funktionen bör kopplas till typen av value i unionstypen, och om det inte är definierat bör parametern vara valfri. Jag skulle vilja kunna anropa det på två sätt:

createMsg('banana', [1, 2, 3]);
createMsg('apple');

Alla mina nuvarande lösningar hittills tvingade mig att ange ett andra argument undefined för 'apple'-unionstypen.

Svar #1

Du kan inte ha villkorliga parametrar, det enklaste sättet att göra detta är att skicka ett Msg till createMsg:

const createMsg = (msg: Msg): Msg => (msg)

const a = createMsg({ type: "apple" })
const b = createMsg({ type: "banana", value: [1,2,3] })

Svar #2

En annan metod skulle vara att använda överlagringar (även om detta kan bli krångligt med många fler beståndsdelar):

type Type = { type: "foo"; value: number[] } | { type: "bar" };

function createMessage(type: "foo", value: number[]): Type;
function createMessage(type: "bar"): Type;
function createMessage(type: "foo" | "bar", value?: number[]) {
    if (value) return { type, value };
    
    return { type };
}

Lekplats

Relaterade artiklar