Microsoft/TypeScript

Function argument is not infered correctly

オープン

#62,336 opened on 2025/08/26

 (1 件のコメント) (0 件のリアクション) (0 人の担当者)TypeScript (13,395 件のフォーク)batch import
Domain: check: Type InferenceHelp WantedPossible Improvement

Repository metrics

Stars
 (108,860 個のスター)
PR merge metrics
 (PR metrics pending)

説明

🔎 Search Terms

function, argument, parameter, generic, callback, infer

🕗 Version & Regression Information

By trying out different versions in Playground, it looks like it works correctly in version 4.7.4 and lower

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXzCgggB4AVAPgApFUAueKqBgZwxi1QHMAaeAIwZkAlPAC8FeGgDWqHAHdUwhlUHwR4yTLmKA3ACh9oSLAQp02PElQkAgjC4t4IAB4YQqYE6ioAngG0AXWp9eGsVADoo2EcGe0dRCSlUWQVUHn1lRiiImJY4hxZErRSdVAN9MDw2eDgWZAgMcQIiCBpUGjRMXHwmPjVUZABbfhAYUQBvAF9hYV0gA

💻 Code

declare function call<T>(fn: (a: string, b: T) => unknown): (b: T) => unknown;

declare function fn<Args extends any[]>(
  fn: (...args: Args) => unknown,
): (...args: Args) => unknown;

const result = call(fn(function (a, b: number) {}));

🙁 Actual behavior

The a parameter's type is any.

🙂 Expected behavior

The a paramater's type should be string

Additional information about the issue

I encountered this while trying to create a helper function in a codebase that uses Effect:

import { Effect } from "effect"

function call<A, E, R, T = void>(fn: (a: string, b: T) => Effect.Effect<A, E, R>) {
  return (b: T) => fn("value", b)
}

const fnA = call((a, b: number) => // a is `string`
  Effect.gen(function* () {
    return yield* Effect.succeed(`${a}: ${b}`)
  }),
)

const fnB = call(
  Effect.fn(function* (a, b: number) { // a is `any`?
    return yield* Effect.succeed(`${a}: ${b}`)
  }),
)

コントリビューターガイド