microsoft / microsoft/TypeScript
Non-exported classes in type declaration files leaking value names
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
TypeScript Version: 3.5.2
Search Terms: ambient module declaration export declare class type name
Code
In a file called classes.d.ts:
declare class A {}
export declare class B extends A {}
In a file called test.js:
let a = require('classes').A;
In a file called test.ts:
import { A } from './types/classes';
[NEW] Assumptions:
The following is a list of assumptions I had when originally opening this issue:
- Type Declaration Files work like modules: once you use
importorexport[on a top-level declaration], only explicitlyexported declarations are visible externally. - Type names declared in a Declaration File are always accessible via
importtypes (at least those that are used byexported types.- E.g.
export class B extends Aexports the type namesAandB, even ifAwas not directlyexported.
- E.g.
- Value names declared in a module-style Declaration File (see
#1above) are only accessible if explicitlyexported.
These assumptions are the result of reading the documentation and working with declaration files. Note that the documentation does not mention:
- All declarations in a declaration file are implicitly exported.
- Special [and undocumented?]
export {};syntax causes only explicitlyexported declarations to be available by consumers of the declaration file.
I list them here to provide context for the Expected Behavior section.
Expected behavior:
In both cases , an Error that name 'A' could be found in module 'classes'.
I expect in this case that TypeScript is capable of resolving the following from the declaration file:
In other words, I should be able to use import types to resolve class A, but attempts to use them should fail.
Actual behavior:
No compiler error in either case. TypeScript-powered IDEs (e.g. VSCode) happily show that the full non-exported class A is available.
In short, a non-exported, declared class should resolve in the same way as an interface.
As things stand today, TypeScript erroneously resolves the Value "A".
Playground Link: NA
Related Issues: NA
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Reproduce el comportamiento utilizando los ejemplos de classes.d.ts, test.js y test.ts del issue y, a continuación, rastrea la resolución de módulos y símbolos de archivos de declaración en el TypeScript compiler. Se considera terminado cuando la clase A no exportada no se expone como un valor, mientras que las referencias de tipos requeridas por la clase B exportada siguen resolviéndose, con cobertura de regresión para ambos ejemplos.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 30/100