2014-06-28 14 views
6

Có nghĩa là bạn không thể sử dụng một cái gì đó như thế này?Generics Typescript sử dụng loại tẩy xoá để thực hiện Generics?

class Helpers 
{ 
    static ObjectAs<T>(val: any): T { 
     if (!(val instanceof T)) { 
      return null; 
     } 

     return <T>val; 
    } 
} 

Bất kỳ giải pháp nào để nhận loại khai báo chung cơ bản?

Cập nhật 1:

Như Ryan Cavanaugh đã đề cập, khi biên soạn, toàn bộ hệ thống loại được xoá hoàn toàn, giống như thực hiện Generics Java. Tôi tin rằng .Net thực hiện Generics để bảo tồn thông tin loại trong mã biên dịch là tốt hơn so với Java. Tuy nhiên, tôi không thể không tự hỏi, tại sao không thể cho phép toàn bộ thời gian chạy nội tâm của các kiểu generic và các tham số kiểu generic trong TypeScript? Tại sao các nhà thiết kế của TypeScript quyết định loại bỏ tất cả các thông tin kiểu chung trong thời gian chạy?

Các mã sau nguyên cảo:

function As<T>(n: any): T { 
    if (n instanceof T) { 
     return n; 
    } else { 
     return null; 
    } 
} 

var obj: Object = 1; 
var x = As<number>(obj); 

thể được dịch sang mã JavaScript này:

function As(n, T) { 
    if (n instanceof T) { 
     return n; 
    } else { 
     return null; 
    } 
} 

var obj = 1; 
var x = As(obj, Number); 

Bảo tồn các loại thông tin trong thời gian chạy và khả năng tương thích với mã js!

Cập nhật 2: tôi đã đăng vấn đề trên CodePlex, hy vọng sẽ nhận được nhiều hơn từ những người đánh máy https://typescript.codeplex.com/discussions/550262

+0

Thật là một câu hỏi tuyệt vời ... hy vọng nó doesnt đóng SO phong cách –

+1

Trang 2 của các tiểu bang đặc điểm kỹ thuật mà tất cả các loại thông tin bị xóa trước khi JavaScript được phát ra bởi trình biên dịch. Với thông tin đó, dự đoán tốt nhất của tôi sẽ nói rằng toán tử instanceof của bạn sẽ là vô nghĩa trong môi trường thời gian chạy. Lời khuyên tốt nhất của tôi là tạo một bài đăng trong diễn đàn thảo luận về đặc điểm kỹ thuật: http://typescript.codeplex.com/discussions/topics/5488/language-specification. Bạn có thể khiến họ suy nghĩ về việc hỗ trợ điều này nếu nó chưa được. –

+0

@ErikNedwidek Đã có trên đó :) –

Trả lời

5

Hệ thống loại được hoàn toàn bị xóa. Bạn có thể thấy điều này trong mã được tạo cho bất kỳ hàm chung nào.

Điều đó nói rằng, đối với các lớp học, vẫn còn một số thông tin thời gian chạy còn lại. Bạn có thể viết này:

class A { } 
class B { } 
function As<T>(n: any, type: { new(...args: any[]): T }): T { 
    if(n instanceof type) { 
     return n; 
    } else { 
     return null; 
    } 
} 

var x = new A(); 
var y = new B(); 
console.log(As(x, A)); 
console.log(As(x, B)); 
+0

Có đối số kiểu để bảo toàn các loại trong thời gian chạy có ý nghĩa hoàn hảo, tuy nhiên tôi tự hỏi tại sao các nhà thiết kế TypeScript quyết định loại bỏ các loại chung hoàn toàn trong mã js được tạo ra? xem bản cập nhật trong bài đăng gốc –

+0

@KamyarNazeri "Có đối số kiểu để bảo toàn các loại trong thời gian chạy có ý nghĩa hoàn hảo". Nhưng Javascript không phải là ngôn ngữ có kiểu con vịt? Vì môi trường đích không có khái niệm kiểu, nên nó có ý nghĩa hoàn hảo cho việc xóa hoàn toàn kiểu. – Aron

+0

@Aron Tôi tin rằng bạn đã hiểu sai ý tôi. đối số * loại * được giữ nguyên trong tệp js được biên dịch xem xét chữ ký phương thức được giữ nguyên! Tuy nhiên nó là khai báo kiểu generic - khi không có trong chữ ký phương thức - được loại bỏ bằng cách xóa bỏ kiểu.Bên cạnh đó là đúng là JavaScript là một ngôn ngữ gõ vịt, tuy nhiên TypeScript là một siêu để JavaScript Tôi tin rằng loại xóa chung có thể là một vấn đề nhỏ hơn –