Bạn có thể làm điều này với các kiểu generic:
function add<T extends string | number>(x: T, y: T): T {
return x + y;
}
add<string>("a", "b"); // OK
add<number>(5, 3); // OK
add<boolean>(true, false); // Type 'boolean' does not satisfy constraint 'string | number'
Chú ý rằng bạn không phải lúc nào cần phải cung cấp các loại generic khi gọi hàm, miễn là nó đáp ứng các hạn chế:
add("a", "b"); // OK
add(5, 3); // OK
add(5, "b"); // Type argument candidate 'number' is not a valid type argument because it is not a supertype of candidate 'string'.
add(true, "c"); // Type argument candidate 'boolean' is not a valid type argument because it is not a supertype of candidate 'string'.
Như bạn có thể thấy, đây đang nói:
x
và y
phải là sa tôi gõ
- kiểu đó phải hoặc là một
string
hoặc một number
(hoặc một phần mở rộng của một trong hai)
Trình biên dịch nguyên cảo là đủ thông minh để làm việc ra các loại mà không chỉ định các thuốc generic trong các cuộc gọi (nhưng bạn phải đặt chúng trong định nghĩa).
Như bạn đã nhận thấy, đây là vấn đề với trình biên dịch TypeScript. Tôi đã logged it on the TypeScript Github repo.
Còn bây giờ, bạn có thể làm điều này:
function add<T extends string | number>(x: T, y: T): T {
return <any>x + <any>y;
}
x
và y
vẫn kiểu T
(đảm bảo bởi trình biên dịch) là nhưng chúng tôi lừa nó vào cho chúng tôi làm +
trên chúng.
Nguồn
2016-11-21 15:37:53
Có thể một bản sao: http://stackoverflow.com/questions/32357839/typescript-how-to-express-a-generic-function-where-the-type-is-restricted-to-on – Paleo