typescript - Bir nesnenin (veya sadece bir sınıfın) bir özelliğe sahip olup olmadığını kontrol et
Diyelim ki bir sınıfım var:
module MyModule {
export class MyClass {
x:number;
y:number;
}
}
O zaman elimde bir "x" stringi var. MyClass'in "x" özelliğine sahip olup olmadığını nasıl kontrol edebilirim?
Eğer MyClass'tan bir örnek oluşturursam ve sonra şunu yaparsam:
myClassInstance.hasOwnProperty("x");
x'in varsayılan bir değeri ayarlanmadıkça false döner. Ama her özellik için varsayılan değer ayarlamak istemiyorum. Bunu MyClass örneğini yaratmadan bile yapabilmek en iyisi olurdu.
Cevap #1
TypeScript, çalıştırılmadan önce JavaScript'e derlenir. Son JavaScript kodunda, TypeScript'teki tür bilgisi artık mevcut değildir. Bu yüzden çalışma zamanında TypeScript tür bilgisini kontrol etme imkânı yoktur.
Eğer derleme zamanında bir kontrol yapmak istiyorsanız, aşağıdaki örnekteki 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); derlenemeyecek çünkü TypeScript derleyicisi objB'nin MyClassB türünde olduğunu ve bu sınıfın IHasX arayüzü tarafından gerektirilen x adlı bir özelliğe sahip olmadığını biliyor.
Cevap #2
Artık bunu yapabilirsiniz. Bir sınıfın veya arayüzün tüm üyelerini listelemenize olanak tanıyan geliştirilmiş bir TypeScript derleyici sürümünü yayınladım. Örneğin, aşağıdakileri yapabilirsiniz:
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ı:
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
İhtiyacınız olan tüm detayları burada bulabilirsiniz
