microsoft / microsoft/TypeScript
Unexpected type assertion result
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Go
- Star
- 111k
- Fork
- 14.3k
- Merge trung bình
- 2 ngày 4 giờ
- Pull request đã merge (30 ngày)
- 132
Mô tả
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)?
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Clone repository repro được liên kết và biên dịch các tệp trong src/ với declarations được bật, sau đó so sánh dist/index.d.ts với đầu ra mong đợi. Bắt đầu bằng cách theo dõi quá trình tạo declaration cho assertion trong src/index.ts và kiểu Model từ src/index.model.ts. Được xem là hoàn tất khi declaration được tạo ra vẫn giữ Model và sử dụng một đường dẫn import vẫn hợp lệ từ dist/.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- typescript
- Lĩnh vực
- compilers
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 25/100