microsoft / microsoft/TypeScript
Computed import types
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.4k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
Suggestion
🔍 Search Terms
import label:feature-request
✅ Viability Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
⭐ Suggestion
Add ability to typeof import() a string literal type
📃 Motivating Example
declare module 'test' {
export const test: number;
}
type GetExport<T extends string> = typeof import(T)
type Test = GetExport<'test'> // typeof import('test') ≈ {test: number}
💻 Use Cases
babel, eslint and webpack use package names in their API, dynamically require them and proxy data into their interface. Generally, API that looks like
doSomething({
package: 'package-name',
options: {
optionForThisPackage: 'value',
},
});
could greatly improve on typing with this.
Also it's often the case with dynamic imports that resulting Promise gets passed through several other methods (like React.lazy or loadable from @loadable/component). Currently the only way to get good types there is to have these duplicated at every import() site. It would be possible to assign some types to wrapper function in this case too.
type LazyRegistry<Packages extends Record<string, string>> = {
[Name in keyof Packages]: Promise<(typeof import(Name))[Packages[Name]]>
}
const lazyRegistry = <Packages extends Record<string, string>>(packages: Packages): LazyRegistry<Packages> => {
return Object.fromEntries(
Object.entries(packages).map(([name, importName]) => {
const lazy = React.lazy(async () => {
return (await import(name))[importName];
});
return [key, lazy] as const;
}),
) as LazyRegistry<Packages>;
};
type LoadableRegistry<Packages extends Record<string, string>> = {
[Name in keyof Packages]: AsLoadableComponent<typeof import(Packages[Name])>
}
const loadableRegistry = <Packages extends Record<string, string>>(packages: Packages) => {
return Object.fromEntries(
Object.entries(packages).map(([name, importName]) => {
return [key, loadable(() => import(importName))] as const;
}),
) as LoadableRegistry<Packages>;
};
const DynamicComponentRegistry = someRegistry({
Foo: 'Foo',
Bar: 'Bar',
});
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia esaminando la gestione esistente di typeof import('literal') e gli esempi di query di tipo nell’issue. Definisci il completamento come la possibilità di consentire un tipo string-literal generico in typeof import(T), preservando al contempo i casi d’uso dimostrati per la tipizzazione dei moduli e degli import dinamici; il payload non nomina file o test del repository.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- javascript, typescript
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 30/100