ITADN

Missing contextual typing for object-literal callback parameter causes generic return type to fall back to `unknown`

#63545Closedoe-andreas-soroko 创建于 2026-06-10
Duplicate
### 🔎 Search Terms contextual typing, callback parameter inference, object literal, unknown fallback, NoInfer ### 🕗 Version & Regression Information - This is the behavior in every version I tried, and I reviewed the FAQ for entries about ✅ - 5.4.5 - 5.9.3 - 6.0.3 - 6.0.0-dev.20260416 _(nightly)_ ### ⏯ Playground Link - [Playground V1](https://www.typescriptlang.org/play/?ts=6.0.3#code/FAMwrgdgxgLglgewgAjAZwKYEUwYE4CeAPACoAiAhjBcgLyoQDWECA7hADTIkCieeCPHQbM2EAHwAKCngDmaAFzIA3sGTIAjrkIBpDASVoYeOBFkBtALprN2ggDEISyQEo645AAUBAWziZSSmpxYABfFyUAVUwcfAIAJQw0MAAbGECqCi5efkEPVXU8DBgwPBQC9WQAE0ylCFSUgEIOG3V8ATwlSCqMEFMMKptQsOBgGAIABwxkaOw7ROS0jOphSFF2bL4O1aYWdg96ZRrqJXJMrnbBAH5TrcFhscnpkjwKCDQQQR97SFhECFIAGUwAAjTBaDAQGApAgAGQQFB6VQAkjAMD4uLD-DBUeiDshJJD4ONTsCwRgIVCYfDEQNcT43LQPFijPTHlNuK93p88D58GRekDQeDcFS4QikfTMdj6fiSGSRUTqRK6WifMgMAAPNEQKpoZAsnFqmxXER7CA2JQVSrIYxvD5fU5ch28n7QeBIIXkynQ8W0lFq6WstUhG0PcYcnja16wQ30nhQuDjUhyjXayF6lQaxPwJI3AmmED4ZD0lxWZAAH2Q9RSKUrDB6fQgA2Qw3UprZ6lOaZ1meUyCT6LQ+ckheLpfLVZrdar3V6-SqrdayA7xpt3a1vf1o4gRaEE+sNvbJbXR7qGAAbvhRuB3f9UJhDQB1JMAC0BGBSGFgqvRRBsUBIEY3DIlULTqIB7wwNwsyGjSPR4AsExARg4HIJBwEkLM9LwfgSEoWhWGYDhKp4HcQj0Gs5qEbB2K4WRuQUWaYgtFIAD6MjyFaNhwFUpygfWc5NgMNjoBgcGkc4jIeLMsSEAsqTpER4l0aR+HvKhMGPqptIMR0oYPhgJG6c4vFKAAcggyK7vgpCgeIXAIBMHrvFa2YUCCX5VPmIIIAgX5vK20kzDE8xJIppDYWq9HqZg2RRei9HkQZjD6B+X6wIIplqhZVk2XgRBRnasYymqCbEsQykSbpsUYOI4jBZZEDmQ0HlfkQlnWXudlVPVYTIAAZJy9o8nyeACiAHV5d1ynGQhtUOcgRUxjAcZlTmlW0UYMVJMhGn1W4-YPOyzwmBQKSAq+gjQYcA58cgRgmGYS4RqdcDncILzvRdV14NBQ39hAFB8oYximLIS7ABh0FmQ9YPPfQABEACMiNQ0B0FFIsN2Gc+b7pd+aIBuikjWke5MU5TVPqLxaHU-TDNHqlBAE5lnQEmgwVoAAdLTy6MwLVNidVCFSe4hlyQQpMQro+hKOYADkPQ+AgCuWBwMsOE4BLBd4CB+Jg3NY-5V6kGdP3XVYUjmP2sMK8jCutpYLjhHTgvu+TYlzfgplVMFYmS6TthxHoBjIIryuq1wCsAExq1wmuOGLTJeL4-gYEbSQmxgZvfVIttgdWwMYEovFBUFbse1XyAAPQ1yWIAluhr5vLI0wwK+0wpP0yAeQgV62ggtqvv4XBJsgrCCIwij89X7t14Z3vs6O92PeD-uhXEQea6H8tK+iUfILH8fB4QSc6+LesGxnxspKbX3nfnd1cEDIN3eXruz3PDPhEAA) - [Playground V2](https://www.typescriptlang.org/play/?ts=6.0.3#code/C4TwDgpgBAggTnAhiAksCBbAPAFQHxQC8UOUEAHugHYAmAzlABQCWVAZhHFGpgJQDaAXSgB+bugxQAXFCoQAbpwBQS0JBJIqdNgHs4GAGIBXKgGNgzHVVwoqAGhIB5I8ALFGEKhdAyct3kQEOM7AquDQOJraehicACIQbDYSDgAyzHTAPBhuJNlklJ70UOmZ+WImANZUOgDuVNJQAN5QwFG6+r7tMcZmFlbJmGkZWRIEAL4qbCbmlg1GdBClwADqzMAAFgDKEAA2EOYQNNlYplaZeTQOOMsAShB0RrvA19n3j894jEpQUAD6iDgAHM6DImj9flBmDRfCgaFAAD5QEw0RKsI4Q34LJYjVI6RCouAyRgBQhBO4PJ6hSHIxbZPEEzjE6EyAByOlsHDgNhoeFJQTelOeEPGUAAZBpEFoOrE4Akkn4JO8qQ54EhUBJcBSPq4+c0oJMVGoInBmIhdlsNnpgER9SyoJlTVQgQawupImbdraPebLdbxfqqIhYjJHawXYazlobfaw87bQAiACMCaUUYucCFNuI2OWa02O32h2OEkY4N+0LsENzuPxhOJvC6nr9cGAQkCUH4LXtAHIkz2DYIq1i6RIGfWmNDGxpPR2y1CrrJgxAZNCDbxh1AAPRb7hsbhQUwbKVA6CbaC7dFQRAAIx0ilaOlaGwyDnWUFqekqoIhO9pEHpOsmUnGEHTacNpx9L0ySYbtFyDEMF3XKtxl4IA) ### 💻 Code ```ts type ArrayItem<T> = T extends (infer Item)[] ? Item : never type TransformFunction<TIn, TOut> = (entity: TIn) => TOut type TransformerDef<TItem, ListItem> = TItem extends ListItem ? unknown : { transform: TransformFunction<TItem, ListItem> } function useListWithSelectedItem<const TId, TListResult, TItemResult>( _args: { id: TId | undefined useListLoader: () => TListResult useItemLoader: (id: NoInfer<TId>) => TItemResult } & TransformerDef<TItemResult, ArrayItem<TListResult>>) { } type TrialShort = { id: string } type Trial = TrialShort & { name: string } const id: string = "1" const result = useListWithSelectedItem({ id, useListLoader: (): TrialShort[] => [{ id: '1' }], // does not work useItemLoader: (id): Trial => ({ id, name: id }), // (id: string) => unknown // useItemLoader: (id) => ({ id, name: id } as Trial), // (id: string) => unknown // useItemLoader: (id) => ({ id, name: id }), // (id: string) => unknown // If I change the line above to this, it works: // useItemLoader: (id: string): Trial => ({ id, name: id }), // (id: string) => Trial // useItemLoader: (id: string) => ({ id, name: id }), (id: string) => {id: string, name: string} }) ``` If I remove `& TransformerDef<TItemResult, ArrayItem<TListResult>>` its also working without specifying `id: string`. ### 🙁 Actual behavior If I leave the parameter unannotated, inference seems to break and the return type ends up as `unknown` If I explicitly annotate the parameter as `id: string`, the expected inference works. ### 🙂 Expected behavior `useItemLoader` already has a contextual function type, so I would expect the parameter in ```ts useItemLoader: (id) => ... ``` to be inferred the same way as in ```ts useItemLoader: (id: string) => ... ``` Because of that, I would also expect the return produces the same inferred result type in both cases. ### Additional information about the issue _No response_
关闭于 2026-06-12 4 条评论