2012-11-10 41 views
6

Có cách nào để tạo đối tượng giao diện mặc định không?Đối tượng giao diện mặc định

Ví dụ:

interface myInterface { 
    A: string; 
    B: string; 
    C: number; 
    D: CustomType; // A custom class 
} 

Thông thường, bạn muốn tạo một đối tượng của giao diện này bằng cách:

var myObj: myInterface = { 
    A: "", 
    B: "", 
    C: 0, 
    D: null 
} 

Tuy nhiên nó sẽ tốt hơn nếu có một số đường cú pháp để làm điều đó như thế này:

var myObj = new myInterface; 
// OR 
var myObj = default(myInterface); 

Từ nghiên cứu của tôi, tôi chưa tìm ra cách để làm điều này; nhưng tôi hy vọng rằng tôi đã bỏ lỡ một cái gì đó.

Trả lời

2

Không có.

Một khai báo giao diện chỉ tồn tại ở thời gian biên dịch, do đó, thời gian duy nhất để thực hiện điều gì đó tương tự như vậy là khi biên dịch. Thật không may, trình biên dịch không cung cấp bất kỳ cấu trúc ngôn ngữ nào để làm điều này, cũng không phải bất kỳ cách nào để mở rộng quá trình biên dịch.


Một cách để giải quyết vấn đề này, là làm một số việc tạo mã; Thêm một hàm tạo đối tượng có cấu trúc đúng. Vấn đề với phương pháp này là bạn phải phân tích cú pháp mã TypeScript hoặc một số Ngôn ngữ cụ thể theo miền.

đọc một cái gì đó như thế này:

<Definitions> 
    <Interface Name="myInterface"> 
     <Member name="A" type="string"/> 
     <Member name="B" type="string"/> 
     <Member name="C" type="number"/> 
     <Member name="D" type="CustomType"/> 
    </Interface> 
</Definitions> 

Và tạo ra một cái gì đó như:

interface myInterface { 
    A: string; 
    B: string; 
    C: number; 
    D: CustomType; 
} 

function InitMyInterface(obj?: any): myInterface { 
    if (obj === undefined) obj = {}; 
    return { 
     A: obj.A === undefined ? "" : obj.A, 
     B: obj.B === undefined ? "" : obj.B, 
     C: obj.C === undefined ? 0 : obj.C, 
     D: obj.D === undefined ? null : obj.D, // or InitCustomType(obj.D) 
    }; 
} 
+0

Bummer Tôi nghĩ rằng có thể là trường hợp = ( –

+0

Nó sẽ là một phần tốt đẹp cho trình biên dịch mặc dù nếu họ đã thêm cú pháp kiểu chữ để làm điều này mặc dù. Aka default (myInterface) biên dịch thành một khai báo đối tượng mặc định. –

14

Bạn có thể sử dụng cú pháp hơi khác nhau và nhận được tất cả các kiểm tra kiểu và IntelliSense.

interface IUserModel{ 
    Name: string; 
    Age: number; 
    Email: string; 
    IsActive: boolean; 
} 

var user = <IUserModel>{}; 

Bạn tạo một đối tượng người dùng trống nhưng trình biên dịch TypeScript vẫn kiểm tra xem bạn có thuộc tính hợp lệ trên đối tượng và vẫn cung cấp hoàn thành mã.

enter image description here

enter image description here

+0

Đây là giải pháp, cảm ơn! –

+0

Đây phải là câu trả lời được chấp nhận! –

0

Để hoàn @Matija bạn có thể làm điều đó trong một dòng quá, và ide của bạn (ví dụ đang visual studio) tự động hoàn thành nó cho bạn:

var user = <IUserModel>{ 
    Name : "foo"; 
}; 

Nó sẽ giúp nếu bạn muốn đặt Giao diện làm thông số, vì vậy điều này cũng hợp lệ (JQueryAjaxSettings là một giao diện và một phần của jquery.d.ts có thể nhận được bởi tsd install jquery):

jQuery.ajax("foo/bar", 
    <JQueryAjaxSettings>{ 
     dataType:"json", 
     cache : true, 

    }); 
Các vấn đề liên quan