microsoft / microsoft/TypeScript
Incomplete infer for generic types
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
TypeScript Version: 4.0.5
Search Terms:
typescript, infer, incomplete, unknown, generic
Expected behavior:
The compiler should be able to extract information of the generic Item type from the function definition and infer string.
Actual behavior:
The compiler is able to infer the Names type as { id: string } but the Item type is unknown.
Related Issues:
Code
interface LoaderConfig<Key, Item> {
loadItems: (keys: readonly Key[]) => Promise<readonly Item[]>;
getKey: (item: Item) => Key;
makeCacheKey: (key: Key) => string;
}
type LoaderConfigByName<Names, Item> = {
[name in keyof Names]: LoaderConfig<Names[name], Item>;
};
function makeLoader<Names, Item>(
configs: LoaderConfigByName<Names, Item>
): void {
console.log(configs);
}
makeLoader({
id: {
loadItems: async (keys: readonly string[]): Promise<readonly string[]> => {
return await Promise.resolve(keys);
},
getKey: (item: string): string => item,
makeCacheKey: (key: string): string => {
return key;
}
}
});
Output
"use strict";
function makeLoader(configs) {
console.log(configs);
}
makeLoader({
id: {
loadItems: async (keys) => {
return await Promise.resolve(keys);
},
getKey: (item) => item,
makeCacheKey: (key) => {
return key;
}
}
});
Compiler Options
{
"compilerOptions": {
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
"strictBindCallApply": true,
"noImplicitThis": true,
"noImplicitReturns": true,
"alwaysStrict": true,
"esModuleInterop": true,
"declaration": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"moduleResolution": 2,
"target": "ES2017",
"jsx": "React",
"module": "ESNext"
}
}
Playground Link: Provided
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 le lien Playground fourni et l’exemple générique makeLoader utilisant TypeScript 4.0.5. Reproduisez le résultat de l’inférence et suivez le traitement du type générique Item par le compilateur. La tâche est terminée lorsque l’exemple infère Item comme étant string tout en préservant le type Names inféré.
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é
- Clairement spécifiée
- Accessibilité débutants
- 38/100