Cách áp dụng kiểu tổng quát cho hàm bên trong trong TypeScript
Tôi đang cố gắng viết một hàm tổng quát trong TypeScript mà cơ bản thực hiện lọc từ mảng. Đây là hàm tương đương trong JavaScript
const filterByProp = function (prop, value) {
return function (item) {
return item[prop] === value;
}
}
const result = people.filter(filterByProp('age', 3))
Mã trên đang hoạt động tốt, tôi muốn chuyển đổi nó sang TypeScript.
Hàm TypeScript dưới đây hoạt động tốt. nhưng hàm bên trong không có kiểu dữ liệu :(
Phiên bản 2:
const filterByProp2 = function <T, K extends keyof T>(prop: K, value: T[K]) {
return function (item): boolean {
return item[prop] === value;
}
}
Phiên bản 3:
Dưới đây mã không hoạt động như mong đợi. Sau khi áp dụng kiểu cho một hàm bên trong.
const filterByProp3 = function <T, K extends keyof T>(prop: K, value: T[K]) {
return function <T>(item: T): boolean {
return item[prop] === value;
}
}
Cách sử dụng :
const result3 = people.filter(filterByProp3<IUser, 'age'>('age', 3)) // Not sure how to pass for inner func <IUser>
Tôi đã gặp một lỗi như
[ts] Type 'K' cannot be used to index type 'T'.
[ts] This condition will always return 'false' since the types 'T[K]' and 'T[K]' have no overlap.
Có ai có thể giúp cách giải quyết việc này không?
Phiên bản 4: Điều này đang hoạt động nhưng tôi thích giải quyết vấn đề của phiên bản 3 hơn.
function filterByProp4<T, K extends keyof T>(
prop: K,
entities: T[],
value: T[K]
) {
return entities.filter(e => e[prop] === value);
}
Câu trả lời #1
Bạn chỉ cần chỉ định cùng một tham số kiểu trên hàm bên trong. Typescript sẽ suy luận T dựa trên kiểu trả về mong đợi của hàm bên ngoài khi bạn sử dụng nó làm đối số cho filter, vì vậy không cần tham số kiểu rõ ràng:
interface Person {
age: number
}
const filterByProp = function <T, K extends keyof T>(prop: K, value: T[K]) {
return function (item: T): boolean {
return item[prop] === value;
}
}
const people: Person[] = [{ age: 3}, { age: 2}];
const result = people.filter(filterByProp('age', 3))
people.filter(filterByProp('age', "3")) //error
people.filter(filterByProp('Age', 3)) //error
