2016-03-30 15 views
7

Bir sınıf olması düşünelim. MyClass'ın "x" özelliğinin olup olmadığını nasıl kontrol edebilirim? Kontrol eğer

Sonra Sınıfım bir örneğini oluşturur ve bu

yapın: x varsayılan değer kümesi olmadıkça yanlış döndürür

myClassInstance.hasOwnProperty("x"); 

. Ancak, her özellik için varsayılan değerler ayarlamak istemiyorum. Eğer MyClass örneğini oluşturmadan bunu yapabilirsem en iyisi olurdu.

+0

gereken tüm ayrıntıları bulabilirsiniz, değil JavaScript. – zeroin

+2

TypeScript çalışma zamanında mevcut değil. TypeScript, yürütülmeden önce JavaScript'e çevrilir. – NineBerry

+0

Açıklarsanız neden çalışma zamanında bazı mülkleri kontrol etmek istediğinizi açıklarsanız, belki de ne denediğinizi başarmanın başka bir yolu vardır. – NineBerry

cevap

3

TypeScript, yürütülmeden önce JavaScript'e derlenmiştir. Son JavaScript kodunda, TypeScript'ten tür bilgisi artık mevcut değildir. Bu nedenle, çalışma zamanında TypeScript türü bilgilerini kontrol etme olanağı yoktur. Eğer derleme zamanında bir çek yapmak istiyorsanız


, aşağıdaki örnekte olduğu gibi arayüzleri kullanabilirsiniz:

interface IHasX 
{ 
    x:any; 
} 

class MyClassA { 
    x:number; 
    y:number; 
} 

class MyClassB { 
    y:number; 
} 

function Test(param: IHasX) 
{ 
    // Do something with param.x 
} 

var objA = new MyClassA(); 
var objB = new MyClassB(); 

Test(objA); 
Test(objB); 

son satırı Test(objB); typescript derleyici olduğunu bildiği için derlemeye başarısız olur objB, MyClassB tipindedir ve bu sınıfın, IHasX arabiriminin gerektirdiği şekilde x olarak adlandırılan bir özelliği yoktur.

0

Şimdi bunu yapabilirsiniz. Bir sınıfın veya bir arabirimin tüm üyelerini listelemenizi sağlayan, TypeScript derleyicisinin geliştirilmiş bir sürümünü yayımladım.

export class Person { 
    name: string; 
    surname: string; 
    age: number; 
    country: string; 
} 

function printMembers(clazz: Class) { 
    let fields = clazz.members.filter(m => m.type.kind !== 'function'); //exclude methods. 
    for(let field of fields) { 
     let typeName = field.type.kind; 
     if(typeName === 'class' || typeName === 'interface') { 
      typeName = (<Class | Interface>field.type).name; 
     } 
     console.log(`Field ${field.name} of ${clazz.name} has type: ${typeName}`); 
    } 
} 

//then, somewhere in your code: 
let p = new Person(); 
printMembers(p.constructor.getClass()); 

ve bu çıktısı şöyledir: Örneğin: aşağıdakileri yapabilirsiniz

$ node main.js 
Field name of Person has type: string 
Field surname of Person has type: string 
Field age of Person has type: number 
Field country of Person has type: string 

Sen typescript seviyesinde bunu yapmak istiyor sen here