2014-06-05 2 views
0

다음은 의사 코드이지만, 나는 그것이 내가 뭘하려고 오전 가장 명확하게 생각 :유형에 따라 instanceof를 동적으로 확인하는 방법이 있습니까?

class C { 
    public var x: number = 34; 
} 

var enforceType<T> = (x: T) : T { 
    if (x instanceof T) { 
     return x; 
    } else { 
     console.log(x); 
     console.log(T.toString()); 
     throw ("wrong type!"); 
    } 
} 

enforceType<C>({}); // should raise the exception! 

문제는 T 클래스는 아니지만 유형, 그래서 instanceof를 작동하지 않습니다, 그리고 toString도 마찬가지입니다. 하지만 런타임에 값이 컴파일 타임을 가지고 있는지 여부를 확인하는 방법이 있습니까?

답변

0

그러나 값이 나는 컴파일 타임이 유형인지 여부를 런타임에 확인하는 방법이

번호

그러나

enforceType<C>({});

할까요 컴파일 오류가있다! 나는 해결책을 가지고

class C { 
    public x: number = 34; 
} 

function enforceType<T>(x: T) : T { 
    return x; 
} 

enforceType<C>({}); // compile error! 
+0

좋아, 내가 예 (가난한 선택으로 인정 : 내 실제 코드에서, 난 정말이 {} HTTP를 통해받은 값으로, 비록 동적 검사를 수행 할 – user2645074

0

하지만 그것은 아주 미친 짓 :

그리고 참으로 그렇습니다.

var enforceType = (phantom: any) => { 
    return (x: any) => { 
     if (subtypeof(x, phantom)) { 
      return x; 
     } else { 
      console.log("error", x, phantom); 
      throw ("wrong type!"); 
     } 
    } 
} 

var subtypeof = (_sub, _super) => { 
    if (typeof _sub !== typeof _super) { 
     return false; 
    } 

    if (typeof(_sub) === "object") { 
     if (_sub === null || _super === null) { 
      return true; 
     } 

     for (var x in _super) { 
      if (!(x in _sub)) { return false; } 
      if (!subtypeof(_sub[x], _super[x])) { return false; } 
     } 
    } 

    return true; 
} 

class C { 
    constructor(public x: number) { 
     return; 
    } 
} 

var enforceC = enforceType(new C(0)); 

console.log(enforceC({x: 8}));   // no exception. good. 
console.log(enforceC({z: "8"}));  // exception. also good. 

이것은 'yes'- 본질적 : 아이디어는 내가 처음 타입 체크 함수에 "팬텀 개체를"전달 및 실행시, enforceType가 팬텀에 대해 모든 개체를 깊은 비교하는 것입니다 내 질문에 대답,하지만 난 두 가지 이유로 그것을 좋아하지 않아 : 그것은 조금 뒤얽힌 것

  • (하지만 난 정적 클래스의 방법으로 enforceC를 구현에 제공 할 수있는 방법이있을 수 있습니다 생각 믹스 인 (mix-in)을 통한 임의의 클래스, 이는 약간 개선 될 것입니다.)

  • 런타임시 모든 개체를 심층 비교합니다. 이것은 아약스를 통해 들어오는 객체에 대해서는 무시할 만하지만, 벤치 마크를주의 깊게 벤치마킹하거나 프로덕션 코드에서 사용하지 않는 것이 좋습니다.

+0

(여전히 누군가를 기대. 훨씬 쉬운 방법이 있다고 말해줘! :) – user2645074

관련 문제