microsoft / microsoft/TypeScript
Spread operator in JSX causes loss of type information for inline functions defined outside the spread operator
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ả
Bug Report
When defining conditional types on a JSX component, using a spread operator causes loss of type information on inline functions while removing the spread operator resolves the issue.
🔎 Search Terms
- "jsx spread"
- "TS7006"
⏯ Playground Link
Playground link with relevant code
💻 Code
Given the following types and JSX:
/**
* Either all properties are included, or none of them should be
* @example
* type Ex = AllOrNone<{ search: string; onSearchChange: (value: string) => void}>
*
* // Ok
* const t1: Ex = {
* search: "hello",
* onSearchChange: (value) => console.log(value)
* }
*
* // Error, needs onSearchChange
* const t2: Ex = {
* search: "hello",
* }
*
* // Error, needs search
* const t3: Ex = {
* onSearchChange: (value) => console.log(value)
* }
*/
export type AllOrNone<T> = T | { [K in keyof T]?: never };
export type OrderHistoryTableProps = {
data: OrderRow[];
noDataText?: string;
} & SortParams &
FilterParams &
SearchParams;
type SortParams = AllOrNone<{
sorting: SortingState;
onSortChange: (state: SortingState) => void;
}>;
type FilterParams = AllOrNone<{
filter: ColumnFiltersState;
onFilterChange: (state: ColumnFiltersState) => void;
}>;
type SearchParams = AllOrNone<{
search: string;
onSearchChange: (value: string) => void;
}>;
function OrderHistoryTable({
data,
noDataText = "No orders to display!",
onFilterChange,
onSortChange,
sorting,
filter,
search,
onSearchChange,
}: OrderHistoryTableProps): JSX.Element {
...
}
/* sorting, filter, and search are correct types */
<OrderHistoryTable
data={rowData}
{...{ sorting, filter, search }}
onSortChange={onSortChange}
onFilterChange={setFilter}
onSearchChange={(value) => setSearch(value)} // TS7006: Parameter 'value' implicitly has an 'any' type.
/>
However, removing the spread operator resolves the issue:
<OrderHistoryTable
data={rowData}
sorting={sorting}
filter={filter}
search={search}
onSortChange={onSortChange}
onFilterChange={setFilter}
onSearchChange={(value) => setSearch(value)}
/>
🙁 Actual behavior
While using the spread operator for other props, the inline function loses type information.
🙂 Expected behavior
Given that the values provided in the spread operator are the correct type, the arguments in the inline function should retain type information.
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 được liên kết trên CodeSandbox và ví dụ JSX, tập trung vào việc định kiểu theo ngữ cảnh của hàm onSearchChange inline khi các props khác sử dụng spread operator. So sánh việc kiểm tra kiểu có và không có spread, sau đó thêm một bài kiểm thử hồi quy cho thấy tham số callback vẫn giữ kiểu mong đợi.
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
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 42/100