microsoft / microsoft/TypeScript
Unexpected type assertion result
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.6.0-dev.20190801
Search Terms:
type assertion absolute importtype assertion importtype cast absolute importtype cast importtype assertion pick
Code
Repo: https://github.com/klemenoslaj/typescript-type-assertion
generated/types.d.ts
export interface TypeD {
da: string;
db: string;
dc: string;
}
export interface Test {
a: string;
b: string;
c: string;
d?: { __private: 'd' } & TypeD;
}
src/index.model.ts
import { Test } from 'generated/types';
type DType = NonNullable<Test['d']>;
export type Model = Pick<DType, keyof Exclude<DType, '__private'>>;
src/index.ts
import { Model } from './index.model';
export class A {
value = <Model>{};
}
dist/index.model.d.ts
import { Test } from 'generated/types';
declare type DType = NonNullable<Test['d']>;
export declare type Model = Pick<DType, keyof Exclude<DType, '__private'>>;
export {};
dist/index.d.ts
export declare class A {
value: Pick<{
__private: "d";
} & import("../generated/types").TypeD, "__private" | "da" | "db" | "dc">;
}
Expected behavior:
I would expect that dist/index.d.ts type definitions would result in:
import { Model } from './index.model';
export declare class A {
value: Model;
}
In fact, this is the result of type definitions, if I change value = <Model>{}; to value: Model = <Model>{};.
Why doesn't typescript use Model directly when type asserting?
Actual behavior:
Results in:
export declare class A {
value: Pick<{
__private: "d";
} & import("../generated/types").TypeD, "__private" | "da" | "db" | "dc">;
}
Playground Link:
I couldn't figure out how to compile declarations in playground, sorry :(
As an alternative please clone the following repo: https://github.com/klemenoslaj/typescript-type-assertion
Explanation:
This is quite a significant problem in monorepo environment.
What happens is that projects are compiled in the dist/ folder and they contain relative path like above (import("../generated/types")), which points from the src/ and not from dist/, effectively producing an error when projects start using one another.
Why doesn't typescript:
- use the original path from the import (
generated/types)? - use the type from assertion directly (
Model)?
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
Clona el repositorio de reproducción enlazado y compila los archivos bajo src/ con las declaraciones habilitadas; después, compara dist/index.d.ts con la salida esperada. Empieza siguiendo la generación de declaraciones para la assertion en src/index.ts y el tipo Model de src/index.model.ts. Se considera terminado cuando la declaración generada conserva Model y usa una ruta de importación que sigue siendo válida desde dist/.
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
- 25/100