Achei que já tinha resolvido isso uma vez, mas agora estou tropeçando nisso de novo.
Considere esta união:
type Handler<T> = (value: T) => void;
type Foo = { a: string; b: Handler<string> } | { a : number; b: Handler<number> }
dado algum objeto x aderindo ao que Foo
eu gostaria de ser capaz de fazer
x.b(x.a);
sem obter alguma variante do erro:
Argument of type 'string | number' is not assignable to parameter of type 'never'.
Type 'string' is not assignable to type 'never'.(2345)
Esta é uma tentativa que venho explorando, mas não produz um resultado diferente:
type Handler<T> = (value: T) => void;
type Correlated<A> = A extends string ? Handler<string> :
A extends number ? Handler<number> :
never;
type Foo<A extends string | number = string | number> = {
a: A;
b: Correlated<A>;
};
function apply<T extends Foo<A>, A extends string | number = T["a"]>(x: T) {
x.b(x.a);
}
Existe uma maneira de restringir o tipo de propriedade correlacionada correta Foo.b a partir do tipo Foo.a ?