-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Discriminated Union Return Type #60467
Comments
For now, you're sort of hitting #30581 and the supported approach to that is described in #47109. Your example would be refactored to interface ClassifierMap {
fooString: string;
barNumber: number;
}
type GenericType<K extends keyof ClassifierMap> = { [P in K]: {
classifier: P;
value: ClassifierMap[P];
} }[K]
function genericFunction<K extends keyof ClassifierMap>(
input: GenericType<K>
): ClassifierMap[K] {
const m: { [P in keyof ClassifierMap]: (input: GenericType<P>) => ClassifierMap[P] } = {
fooString(input) { return input.value[0] },
barNumber(input) { return input.value + 1 }
};
return m[input.classifier](input);
}
const val = genericFunction({
classifier: 'fooString',
value: 'foo',
}); which compiles and behaves as desired. Maybe we can open a new version of #33014/#33912 for the unsupported cases not handled by #56941, and then this would be lumped in there? |
@jcalz Thank you so much for the links, explanation and reworked example. |
This issue has been marked as "Design Limitation" and has seen no recent activity. It has been automatically closed for house-keeping purposes. |
π Search Terms
discriminated union return type
π Version & Regression Information
β― Playground Link
https://www.typescriptlang.org/play/?ts=5.6.3#code/C4TwDgpgBAwgNgQwM5IJYDNUQE5QLxQDk6A9iQMrDaoB2A5oVAD5EBGC2AcgK4C2rOQgG4AUCNCRYiFBizYAKuAgAeeVAgAPYBBoATJFORpMOAHz4oazdr0HiZStXqERUKAH4oSKrTquoAFxQNHwC2KLiSlAA4jo4qADGipCq6lo6+oYyJtjmBADe-gnSxnJB8qJuAG4IcNwQQfBGsjjJKvKmogC+ERLQsTTxSUoAsghgFoVupBQ+9EEDQ23K9rNODJ3+7FyhOAtx1MMphNs8-IKbPWIA9NdQ3EjQwAAWqAbAJFAJ2BAI2lAIKB9AFQXRvb6oXi0P4QXT3GioEg0faDQ7LVaOXyEcwsRZopQrU67bDYkS3AEGEhgMAkR5wj4gmhIgC0YKQCUhtGAMLh3ARSJiB0S6JmmOczDYHDOYVJwLxwqUAFV+TRUtYMgYmtk5HkoFMoABtADSUFolgAuiilqNxsbzd0DfJ7WJgVrSq0bRMCv5jaaaFl3dhLYLUQqUkbTAbCDU6hBCM6rmS7g8nq93p9vr9-oDgYC2RCoTQefDEciAy0FASMXMNhK3RX0UTziTTEmKVAqTS6UDPoCmTRWeDOTRudpeSryzkRQ4a4wWCcpcTZVF61OlSq1elbJOdZMfSazU7GiUG567Q6nRF0HyEsBS1A6EKEgAxG93pGbmyZVc6gAU-gAfWKZocnKAAaKByUGWEeygMAjBBXQ+F4EAvhPHIoBqXAGWeCA4AmF4niUdlqDAYAvhIXgwFQOAcAggB3CBUGwOFWG4cimXI+jnj+IE0ygH4aWwci3gBVgSHY-xaDAdirXxSBlVLVRWwASmPEC5DaRSPw6PUpPQKBf2k9iADpgO1HB8DwAhq3WQgVL0tw3B+YBuGwf1jOAEyY3qA0AAZnVuEyoAAPTC8KoAAUQAJWigB5aKgm8dZTQMTiKTQOgi1YWjYOBQYqhwfwunUOBHkcpyXLcjyaBkryfOgABqKAAEZRCC0LwrCqLYoSoIQmbVLghIcjmiyhAcqeT58ogQrsGKkQujEBIkW8TDagsR9QxfN9S1-WysQgwoOrcCK2JEgwVuwH5bzgVDaHQHAfjhZAQWS3woFwn4inQsoiFFWcwP8BqglWQgga6FShCAA
π» Code
π Actual behavior
When calling
genericFunction
the return type is correctly infered as a string (or number depending on the input).However inside the function itself: the type checking is not working for return types
π Expected behavior
The type checking should be consistent between the place where the function is called and where the actual function return is defined.
Additional information about the issue
All type checking works as expected where the function is called.
e.g.
and
The text was updated successfully, but these errors were encountered: