2013-08-13 34 views
6

Tôi đã viết chức năng nhỏ để xử lý tốt hơn với các loại.Nhận loại tham số chung

function evaluate(variable: any, type: string): any { 
    switch (type) 
    { 
     case 'string': return String(variable); 
     case 'number': return isNumber(variable) ? Number(variable) : -1; 
     case 'boolean': { 
      if (typeof variable === 'boolean') 
       return variable; 

      if (typeof variable === 'string') 
       return (<string>variable).toLowerCase() === 'true'; 

      if (typeof variable === 'number') 
       return variable !== 0; 

      return false; 
     } 
     default: return null; 
    } 
} 

function isNumber(n: any): boolean { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
} 

Tôi thử cùng với generics, nhưng không biết cách lấy loại từ thông số chung. Nó có thể?

+0

Không phải là không. Kiểu gõ của TypeScript chỉ là một tính năng biên dịch. JavaScript đầu ra không có thông tin kiểu và không có cơ sở phản chiếu. Bạn phải dựa vào '' typeof'' cũ trong mã của bạn như trong JavaScript. –

+0

Đối với bản ghi, bạn có thể thu gọn trình xử lý của mình cho các biến bool thành 'return !! variable;' –

Trả lời

9

typeof là một nhà điều hành JavaScript. Nó có thể được sử dụng trong thời gian chạy để nhận được các loại JavaScript biết. Generics là một khái niệm TypeScript giúp kiểm tra tính chính xác của mã của bạn nhưng không tồn tại trong đầu ra được biên dịch. Vì vậy, câu trả lời ngắn gọn là không, điều đó là không thể.

Nhưng bạn có thể làm điều gì đó như thế này:

class Holder<T> { 
    value: T; 
    constructor(value: T) { 
     this.value = value; 
    } 
    typeof(): string { 
     return typeof this.value;  
    } 
} 

Try it out.

Điều này có tác dụng vì tôi đang vận hành trên giá trị bên trong Chủ sở hữu chứ không phải trên chính Chủ sở hữu.

+5

Có đúng không trong năm 2017 chúng ta không thể nhận được tên của loại được truyền trong generics, ngoại trừ như thế này? – veljkoz

+1

trả lại this.value.constructor ['name']; // <- dường như hoạt động trong sân chơi kiểu chữ. Lấy từ [ở đây] (http://stackoverflow.com/questions/13613524/get-an-objects-class-name-at-runtime-in-typescript). Có thể là vấn đề với việc rút gọn, vv –

+0

Về lý thuyết bạn cũng có thể làm: chức năng tạo (c: {new(): T;}): T { trả về c(); } Tôi không thể làm cho nó hoạt động từ https://www.typescriptlang.org/docs/handbook/generics.html – titusfx

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