microsoft / microsoft/TypeScript
Type inference lost after spreading array with `ArrayLike`
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
array inference, type inference, ArrayLike, lodash compact, _.compact
🕗 Version & Regression Information
- This changed between versions 4.9.5 and 5.0.4
⏯ Playground Link
💻 Code
type MyType<T extends unknown> = {
myKey: T;
myFunction: (arg1: T) => void;
};
const generate = (): Array<MyType<string>> => {
return Array.from({ length: 5 }).map<MyType<string>>((_, index) => {
return {
myKey: `${index}`,
myFunction: (arg1) => {
return;
},
};
});
};
const arrayLikeInferenceFunction = <T extends unknown>(
arr: ArrayLike<T | null | undefined | false | "" | 0> | null | undefined
): T[] => {
return [];
};
const arrayLikeInference = arrayLikeInferenceFunction([
{ myKey: "123", myFunction: (value) => {} }, // value is correctly inferred as string
true && { myKey: "456", myFunction: (value) => {} },
false && { myKey: "456", myFunction: (value) => {} },
...generate(),
// type inference of myFunction is lost
true && { myKey: "456", myFunction: (value) => {} }, // value is inferred as any
false && { myKey: "456", myFunction: (value) => {} },
{ myKey: "456", myFunction: (value) => {} },
]);
const arrayInferenceFunction = <T extends unknown>(
arr: Array<T | null | undefined | false | "" | 0> | null | undefined
): T[] => {
return [];
};
const arrayInference = arrayInferenceFunction([
{ myKey: "123", myFunction: (value) => {} }, // value is correctly inferred as string
true && { myKey: "456", myFunction: (value) => {} },
false && { myKey: "456", myFunction: (value) => {} },
...generate(),
// type inference of myFunction is kept
true && { myKey: "456", myFunction: (value) => {} }, // value is correctly inferred as string
false && { myKey: "456", myFunction: (value) => {} },
{ myKey: "456", myFunction: (value) => {} },
]);
🙁 Actual behavior
The typings of the arguments of myFunction are lost after the array spread when using ArrayLike. When using Array, the type inference is kept.
🙂 Expected behavior
The arguments of myFunction should be inferred as string
Additional information about the issue
I have opened a similar issue in the DefinitelyTyped repository for the lodash typings and they suggested opening an issue in this repository. https://github.com/DefinitelyTyped/DefinitelyTyped/discussions/69410
The issue originated from using lodash.compact() with code similar to the code below:
import _ from "lodash";
type MyType<T extends unknown> = {
myKey: T;
myFunction: (arg1: T) => void;
};
const generate = (): Array<MyType<string>> => {
return Array.from({ length: 5 }).map<MyType<string>>((_, index) => {
return {
myKey: `${index}`,
myFunction: (arg1) => {
return;
},
};
});
};
const lodashInferred = _.compact([
{ myKey: "123", myFunction: (value) => {} }, // infers value as string
true && { myKey: "456", myFunction: (value) => {} },
false && { myKey: "456", myFunction: (value) => {} },
...generate(),
{ myKey: "123", myFunction: (value) => {} }, // infers value as any
true && { myKey: "456", myFunction: (value) => {} },
false && { myKey: "456", myFunction: (value) => {} },
]);
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 reproduction được liên kết trong Playground bằng TypeScript 5.0.4 và so sánh các trường hợp ArrayLike và Array xoay quanh spread của generate(). Theo dõi hành vi suy luận kiểu cho các tham số callback; hoàn thành khi các đối số của myFunction được suy luận là string sau spread của ArrayLike, với regression được báo cáo được bao phủ bằng một test.
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
- 35/100