Typescript, begrens den andre parameteren til å avhenge av typen til den første parameteren


Jeg har 2 objekttyper: TypeA og TypeB. Jeg vil definere en funksjon som tar to parametere. Hvis den første parameteren er av typen TypeA, kan den andre kun ta verdiene 'a' eller 'b'. Men hvis den første parameteren er av typen TypeB, kan den andre kun ta verdiene 'c' eller 'd'.

const A:TypeA =...
const B: TypeB =...

myfunct(A,'a') fine
myfunct(B,'c') fine
myfunct(A,'c') not fine

Takk

Svar #1

Noe sånt burde gjøre susen:

interface TypeA { prop1: string }
interface TypeB { prop2: string }
type SmallA = 'a' | 'b';
type SmallB = 'c' | 'd';
interface MixedA {
    prop1: TypeA;
    prop2: SmallA;
}
interface MixedB {
    prop1: TypeB;
    prop2: SmallB;
}

function myFunc(param: MixedA | MixedB) { }

const A: TypeA = { prop1: "w" };
const B: TypeB = { prop2: "w" };

myFunc({ prop1: A, prop2: 'b' })

Håper det hjelper.

Svar #2

Ved å bruke overbelastning, kan du gjøre dette:

class TypeA { prop1: string };
class TypeB { prop2: string };

type ab = 'a' | 'b';
type cd = 'c' | 'd';

function func(p1: TypeA, p2: ab): void;
function func(p1: TypeB, p2: cd): void;
function func(p1, p2): void {
    console.log(p1, p2);
}

const ta = new TypeA();
const tb = new TypeB();

func(ta, 'a'); // OK
func(ta, 'b'); // OK
func(tb, 'a'); // NO OK
func(tb, 'c'); // OK
func(ta, 'c'); // NO OK

Relaterte artikler