microsoft / microsoft/TypeScript

Function argument is not infered correctly

Ouverte
#62,336 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub
Domain: check: Type Inference Help Wanted Possible Improvement
Langage dominant
Go
Étoiles
111k
Forks
14.3k
Merge moyen
2 j 4 h
PR mergées (30 j)
132

Description

### 🔎 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

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

declare function fn(
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:

```ts
import { Effect } from "effect"

function call(fn: (a: string, b: T) => Effect.Effect) {
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}`)
}),
)
```

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par exécuter l’exemple TypeScript Playground lié et comparez les types inférés de `a` dans le callback direct et dans le callback encapsulé avec `fn`. Étudiez l’inférence des arguments de callbacks génériques autour de `call` et `fn` ; le travail est terminé lorsque le callback encapsulé infère `a` comme `string` plutôt que `any`, tout en préservant l’inférence existante de `b: number`.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.