79765295

Date: 2025-09-15 14:52:06
Score: 0.5
Natty:
Report link

This can be done with a type lookup, although it looks like you might have to use an as cast when you pass the parameter to make sure typescript knows its the right input type:

type Output<I> = I extends InputA ? OutputA
                : I extends InputB ? OutputB
                : I extends InputC ? OutputC
                : never;

function transform<I>(input: I): Output<I> {
    // todo
}

const a = transform({ type: "a" } as InputA);
//    ^? OutputA
const b = transform({ type: "b" } as InputB);
//    ^? OutputB
const c = transform({ something: "else" } as InputC);
//    ^? OutputC

The as cast may not be needed, providing Typescript can infer the type from elsewhere.

TSPlayground: https://www.typescriptlang.org/play/?#code/JYOwLgpgTgZghgYwgAgJIgA4FcwEFkDeAUMqcmAJ4YQBcyARHPQNxEC+RRoksiK62MACFCJMpWp16AIxbtO3aPCRpMOAMKiyyAM4B7ALYQwAC1ABzKRAA2OiHI5dwSvsgDyOQfmLaJtBkysjoq8Kh5ggiI+4lT+Mg4KzqEo4YKa0aR+UggJRH7unjgAPKgAfMgAvGjIEAAekCAAJjqqXsgA-AUROLhi2v39dKg19RBNLQI4Ip2pU30DC0MjDc2tGh1dafMLg8ggEABu0KxEMFggCGDAeiDkUHAgOjB6UAYlpQAUoIJDAJR0szA7y0ZAA9KDyHpGnp5lBjFgoLdzo0IDBQBBGkFOAgbjowMg4JU7g8ni8DB8CORYlImMg2ASJmo8L9WODtAA9GaFPBEHGPfHSIlge6PZ6vClUyQMWR0hlrYQsohssiczZzPl45AIIUi0niyn6IymCxWWz2WVwRlpRXK0iqwHqIA

Reasons:
  • Probably link only (1):
  • Long answer (-0.5):
  • Has code block (-0.5):
  • Low reputation (0.5):
Posted by: Michael