2017-05-19 10 views
3

나는 기능을 수행 할 객체를 전달하고 런타임에 유형을 확인하는 방법을 찾고있다. 이것은 의사 코드 :TypeScript에서 런타임시 오브젝트 유형을 확인하는 방법은 무엇입니까?

func(obj:any){ 
    if(typeof obj === "A"){ 
    // do something 
    } 
    else if(typeof obj === "B"{ 
    //do something else 
    } 

} 
a:A; 
b:B; 
func(a); 

그러나 대해서 typeof는 항상 "개체"를 반환하고 내가 "a"또는 "b"의 실제 유형을 얻을 수있는 방법을 찾을 수 없습니다. instanceof도 작동하지 않고 반환했습니다. TypeScript에서 어떻게 할 수 있습니까?

도움 주셔서 감사합니다.

답변

6

유형은 컴파일 타임에 제거되며 런타임에 존재하지 않으므로 런타임에 유형을 확인할 수 없습니다.

interface A { 
    foo: string; 
} 

interface B { 
    bar: number; 
} 

function isA(obj: any): obj is A { 
    return obj.foo !== undefined 
} 

function isB(obj: any): obj is B { 
    return obj.bar !== undefined 
} 

function func(obj: any) { 
    if (isA(obj)) { 
    // In this block 'obj' is narrowed to type 'A' 
    obj.foo; 
    } 
    else if (isB(obj)) { 
    // In this block 'obj' is narrowed to type 'B' 
    obj.bar; 
    } 
} 

: 당신이 할 수있는 일

는 객체의 모양은 당신이 기대하는 것을 확인하고 모양이 당신의 기대에 일치하는 경우는 타이프 라이터가 true 반환하는 user-defined type guard를 사용하여 컴파일시에 유형을 주장 할 수있다 Example in Playground

+0

대단히 감사합니다. 지금은 분명합니다! – Eden1971

+0

이것을 확인하십시오 : https://aliolicode.com/2016/04/23/type-checking-typescript/하시기 바랍니다 해안, 당신은 또한이 줄을 참조하십시오 : console.log (john instanceof Person); // 참 ... 건배! – peter70

+0

@ peter70 클래스 인스턴스에서만 작동하며 다른 유형 (예 : 인터페이스)에서는 작동하지 않습니다. OP는'instanceof'는 작동하지 않는다고 언급 했으므로 나는 그가 클래스가 아닌 인스턴스 객체를 가지고 있다고 가정합니다. – Aaron