microsoft / microsoft/TypeScript
Declaration emit inlines types incorrectly
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Go
- Star
- 111k
- Fork
- 14.4k
- Merge trung bình
- 1 ngày 19 giờ
- Pull request đã merge (30 ngày)
- 117
Mô tả
🔎 Search Terms
declaration emit inline
🕗 Version & Regression Information
I was unable to test this prior to 4.4 since React types are no longer compatible with that version.
⏯ Playground Link
No response
💻 Code
import * as React from "react";
export class Component extends React.Component<{ children: React.ReactNode }> {
render() {
if (Math.random()) {
return <div>{this.props.children}</div>;
} else {
return this.props.children;
}
}
}
Full repro: https://github.com/eps1lon/ts-module-auto-export/tree/bad-inline
🙁 Actual behavior
Return value from render() is not referencing React.ReactNode but inlines its (incomplete) union members:
import * as React from "react";
export declare class Component extends React.Component<{
children: React.ReactNode;
}> {
render(): string | number | boolean | Iterable<React.ReactNode> | import("react/jsx-runtime").JSX.Element;
}
🙂 Expected behavior
Return type references the type alias. Inlining union members is incorrect (we may add or remove members or treat members as internal, local types) generally and here specially not even using all members.
export declare class Component extends React.Component<{
children: React.ReactNode;
}> {
render(): React.ReactNode | import("react/jsx-runtime").JSX.Element;
}
Additional information about the issue
The fact that it inlines the type here is a special case of https://github.com/microsoft/TypeScript/issues/37151. https://github.com/microsoft/TypeScript/issues/37151 is a more general since it's not always clear when inlining is correct or not. I'd be curious to know what would break if TS would not stop inlining in this special case.
But this issue is also broader since the inline is incomplete.
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
Bắt đầu với bản tái hiện bad-inline được liên kết của ts-module-auto-export và kiểm tra đầu ra declaration emit của TypeScript cho Component.render. So sánh kiểu trả về được phát ra với tham chiếu React.ReactNode mong đợi, sau đó sử dụng issue #37151 để hiểu hành vi inlining liên quan; được xem là hoàn tất khi union được phát ra đầy đủ và thông qua type alias như được minh họa.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- react, 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
- 38/100