2013-07-31 28 views
7

i am new to typescript, đây là một giao diện mà tôi muốn thực hiện;cách triển khai phương pháp ghi đè trong Giao diện TypeScript?

interface IThing{ 
    name:string; 
    age:number; 
    sayHello:{ 
     (name:string):string; 
     (age:number):number; 
    } 
} 

sayHello có hai chữ ký mà chỉ phiên bản quá tải. tôi chỉ không biết làm thế nào để thực hiện điều đó trong một lớp học, bất kỳ sự giúp đỡ nào? cảm ơn.

+0

Điều đó không giống như TypeScript hợp lệ đối với tôi. Bạn đã xem xét các mẫu mã ở đây chưa? http://www.typescriptlang.org/Tutorial/ –

+0

không có lỗi nào xảy ra qua IntelSense, tôi nhận đoạn mã này từ video giới thiệu về các loại tại đây: http://channel9.msdn.com/posts/Anders-Hejlsberg-Giới thiệu -TypeScript –

+3

Đây là TypeScript hoàn toàn hợp lệ và đây là một câu hỏi hợp lý, đơn giản. Bỏ phiếu để mở lại. –

Trả lời

8

Để thực hiện chức năng quá tải, hãy viết tất cả các chữ ký quá tải cuộc gọi bạn muốn hiển thị trước, sau đó là chữ ký thực hiện là phần thừa của tất cả chữ ký quá tải. Ví dụ:

class Thing implements IThing { 
    // Implement the name and age fields 
    name: string; 
    age: number; 

    // Overload signature #1 
    sayHello(name: string): string; 
    // Overload signature #2 
    sayHello(age: number): number; 
    // Implementation signature, not visible to external callers 
    sayHello(arg: any): any { 
     if(typeof arg === 'string') { 
      return this.name; 
     } else if(typeof arg === 'number') { 
      return this.age; 
     } else { 
      throw new Error('sayHello can only take string or a number'); 
     } 
    } 
} 

var x = new Thing(); 
var n = x.sayHello('world'); // n: string 
var a = x.sayHello(42); // a: number 
var e = x.sayHello(false); // error: false is not string or number 
+0

+1. Tôi sẽ thêm rằng bạn bỏ qua chữ ký thực hiện khi thêm một phương thức quá tải vào một giao diện, bạn chỉ cần nó cho các lớp, như được hiển thị trong câu trả lời này. – Fenton

+0

hoạt động tốt. cảm ơn, đây có phải là cách duy nhất để thực hiện việc này không? tôi thấy cơ chế ghi đè này dường như chỉ được sử dụng để hạn chế kiểu input-args/return-values? nếu không tôi có thể tuyên bố chữ ký chức năng như sayHello (arg: any): bất kỳ trong giao diện của tôi, và sau đó công cụ đoạn mã sayHello (arg: any): bất kỳ {// if ... else ...} trong triển khai của tôi lớp học. bất kỳ giúp đỡ rõ ràng sự nhầm lẫn của tôi? –

+0

@Steve Fenton, xin lỗi tôi không hiểu những gì bạn nói tốt, chỉ cần điều đó cho các lớp học? –

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