microsoft / microsoft/TypeScript
`silentNeverType` leak in contextual parameter types coming from anonymous non-aliased object type instantiations
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.3k
- Merge moyen
- 2 j 4 h
- PR mergées (30 j)
- 132
Description
🔎 Search Terms
silent never type return type inference alias propagating anonymous object
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
interface P<T> {
then: (onfulfilled: (value: T) => unknown) => unknown;
}
interface PConstructor {
new <T>(executor: (resolve: (value: T) => void) => void): P<T>;
}
declare var P: PConstructor;
declare function foo1<T>(x: () => P<{ default: T }>): T;
const result1 = foo1(() => {
return new P((resolve) => {
resolve;
});
});
type WithDefault<T> = { default: T };
declare function foo2<T>(x: () => P<WithDefault<T>>): T;
const result2 = foo2(() => {
return new P((resolve) => {
resolve;
});
});
declare function foo3<T>(x: () => P<[T]>): T;
const result3 = foo3(() => {
return new P((resolve) => {
resolve;
});
});
declare function foo4<T>(x: () => P<{ default: { prop: T } }>): T;
const result4 = foo4(() => {
return new P((resolve) => {
resolve;
});
});
declare function foo5<T>(x: () => P<{ default: [T] }>): T;
const result5 = foo5(() => {
return new P((resolve) => {
resolve;
});
});
🙁 Actual behavior
Only foo2 and foo3 have errors and we can see that their inner resolves reference never
🙂 Expected behavior
All of those should consistently error and resolve should be typed as (value: unknown) => void. Specifically, foo1 and foo2 are the almost the same signatures but foo2 is using a type alias in its declaration which changes the inference behavior. This is strong indication of the bug here
Additional information about the issue
No response
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par reproduire l’exemple de Playground et comparer l’inférence des paramètres contextuels de foo1 à foo5, en particulier les instanciations d’objets anonymes par rapport au type alias WithDefault. Suivez le chemin d’inférence de types qui produit le type resolve interne ; c’est terminé lorsque les cinq cas signalent systématiquement des erreurs et que la résolution de type est signalée comme acceptant unknown.
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é
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 48/100