2013-02-11 60 views
35

Tại sao không phải kiểu chữ cảnh báo tôi rằng hàm tôi định nghĩa không khớp với khai báo giao diện, nhưng nó cảnh báo tôi nếu tôi cố gắng gọi hàm.Giao diện chức năng kiểu chữ

interface IFormatter { 
    (data: string, toUpper : boolean): string; 
}; 

//Compiler does not flag error here. 
var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

upperCaseFormatter("test"); //but does flag an error here. 

Trả lời

53

Giao diện đảm bảo rằng tất cả người gọi các chức năng mà thực hiện giao diện cung cấp các đối số cần thiết - datatoUpper.

Vì TypeScript hiểu rằng JavaScript không quan tâm nếu bạn vượt qua các đối số không được sử dụng, nó khéo léo cho phép điều này trong triển khai.

Tại sao điều này lại ổn? Bởi vì nó có nghĩa là bạn có thể thay thế bất kỳ việc thực hiện giao diện nào mà không ảnh hưởng đến mã gọi.

Ví dụ: Bạn có thể thay thế triển khai IFormatter và mã hoạt động.

interface IFormatter { 
    (data: string, toUpper : bool): string; 
}; 

var upperCaseFormatter: IFormatter = function (data: string) { 
    return data.toUpperCase(); 
} 

var variableCaseFormatter: IFormatter = function (data: string, toUpper: bool) { 
    if (toUpper) { 
     return data.toUpperCase(); 
    } 

    return data.toLowerCase(); 
} 

// Switch between these at will 
//var formatter = upperCaseFormatter; 
var formatter = variableCaseFormatter; 

formatter("test", true); 

Nếu nguyên cảo không làm điều này, upperCaseFormatter của bạn sẽ phải cần phải có một tham số gọi toUpper rằng không được sử dụng bất cứ nơi nào trong hàm - mà làm cho mã dễ đọc hơn.

+0

Nhưng sau đó sử dụng 'upperCaseFormatter' có giá trị boolean thừa:' upperCaseFormatter ("test", true); // loại trừ 'true' sẽ dẫn đến cảnh báo trình biên dịch'. Vì vậy, thay vào đó giao diện là sai và phải là: 'interface IFormatter {(dữ liệu: string, toUpper?: Bool): string; } 'Nhưng điều này có nghĩa là bạn có thể gọi' variableCaseFormatter' chỉ với 'variableCaseFormatter ('test');' mà không chỉ định 'toUpper' mặc dù nó nằm trong chữ ký hàm. Xem câu hỏi của tôi ở đây cho một ví dụ đơn giản về sự nhầm lẫn hiện tại của tôi: http://stackoverflow.com/questions/23305020 – AJP

+5

@AJP nếu bạn đang viết mã sạch, bạn sẽ không bao giờ viết trình định dạng trường hợp biến. Bạn sẽ viết một lớp cho trên và một cho thấp hơn và tránh các đối số boolean khó chịu hoàn toàn. – Fenton

+0

@AJP Trong trường hợp bạn gọi 'upperCaseFormatter' trực tiếp giao diện là không liên quan. –

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