Missing contextual typing for object-literal callback parameter causes generic return type to fall back to `unknown`
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 条评论