2016-11-21 14 views
7

Có cách nào để đạt được điều sau với TypeScript không?TypeScript, liên kết nhiều tham số với cùng một loại

function add(x, y) { 
    return x + y; 
} 

Tôi muốn những điều sau để biên dịch:

add(1, 2); 
add("hello ", "world"); 

Nhưng tôi không muốn những điều sau để biên dịch:

add(4, "world"); 
add("hello ", 4); 

Cũng lưu ý, tôi muốn nó biên dịch cho chuỗi và số chỉ có.

+0

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

Trả lời

6

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:

  • xy 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; 
} 

xy 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.

+2

Đáng buồn là nó không biên dịch ... 'Toán tử' + 'không thể áp dụng cho các loại' T 'và' T'' – Balzard

+0

Bạn đang sử dụng phiên bản TypeScript nào? Nó có thể là một vấn đề với trình biên dịch. –

+0

@JamesMonger Không, nó không hoạt động ngay cả trong bản 2.2 (@next). –

1

Nó có thể được thực hiện như thế này:

function add<T extends string | number>(x: T, y: T): T; 
function add(x: any, y: any) { 
    return x + y; 
} 

let s = add("a", "b"); // fine 
let n = add(1, 2); // fine 
let n2 = add(1,"2"); // error 

Đây là cách bạn phải làm điều đó bây giờ, mặc dù tôi rất vui @JamesMongar mở vấn đề GitHub. Nếu T mở rộng chuỗi hoặc số nguyên thủy, thì toán tử + trên T chắc chắn là hợp lệ.

+0

Giải pháp tuyệt vời @Erigotto –

Các vấn đề liên quan