TypeScript의 'instanceof'에서 " 'Foo'는 유형 만 참조하지만 여기서는 값으로 사용되고 있습니다."라는 오류가 표시되는 이유는 무엇입니까?
이 코드를 작성했습니다
interface Foo {
abcdef: number;
}
let x: Foo | string;
if (x instanceof Foo) {
// ...
}
그러나 TypeScript는 다음과 같은 오류를주었습니다.
'Foo' only refers to a type, but is being used as a value here.
왜 이런 일이 발생합니까? instanceof
내 값에 주어진 유형이 있는지 확인할 수 있다고 생각 했지만 TypeScript는 이것을 좋아하지 않는 것 같습니다.
무슨 일이야
문제는 즉 instanceof
자바 스크립트에서 구조체이며, 자바 스크립트, instanceof
기대 값 우측 피연산자한다. 특히 x instanceof Foo
JavaScript Foo.prototype
에서는 .NET Framework의 프로토 타입 체인에 존재 하는지 여부를 확인하기 위해 런타임 검사를 수행합니다 x
.
그러나 TypeScript에서 interface
s에는 방출이 없습니다. 즉 , 런타임에 존재 Foo
하거나 Foo.prototype
존재 하지 않으므로이 코드는 확실히 실패합니다.
TypeScript는 이것이 결코 작동 하지 않을 수 있음을 알려줍니다 . Foo
유형일 뿐이며 전혀 값이 아닙니다!
"대신 무엇을 할 수 instanceof
있습니까?"
유형 가드 및 사용자 정의 유형 가드를 살펴볼 수 있습니다 .
"하지만 방금 an interface
에서 a 로 전환 하면 class
어떨까요?"
당신은 전환 유혹 할 수있는 interface
A와 class
,하지만 당신은 타이프 라이터의 구조 형식 시스템에서 그 (것은 주로 어디에 실현해야한다 기반 셰이프 ), 주어진 클래스와 같은 모양이있는 객체를 생성 할 수 있습니다 :
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y = {
a: 10, b: true, c: "hello",
}
// Works!
x = y;
y = x;
이 경우, 당신은 x
과 y
같은 유형이,하지만 사용하려고하면 instanceof
둘 중 하나에, 당신은 다른 한편으로는 반대의 결과를 얻을 수 있습니다. 그래서 instanceof
하지 않습니다 정말 당신이 타이프의 구조 유형을 활용하는 경우 유형에 대해 많이 말한다.
Daniel Rosenwasser가 옳고 멋질 수도 있지만 그의 대답을 수정하고 싶습니다. x의 인스턴스를 확인할 수 있습니다. 코드 조각을 참조하십시오.
그러나 x = y를 할당하는 것도 똑같이 쉽습니다. 이제 y는 C의 모양 만 가졌으므로 x는 C의 인스턴스가 아닙니다.
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y = {
a: 10, b: true, c: "hello",
}
console.log('x is C? ' + (x instanceof C)) // return true
console.log('y is C? ' + (y instanceof C)) // return false
'programing' 카테고리의 다른 글
문자열 내에서 문자열이 나타나는 횟수 계산 (0) | 2021.01.16 |
---|---|
데이터 테이블 온더 플라이 크기 조정 (0) | 2021.01.16 |
던지지 않도록 IDisposable.Dispose ()를 구현해야합니까? (0) | 2021.01.15 |
constexpr은 람다 함수 / 식에서 지원됩니까? (0) | 2021.01.15 |
MySQL vs. JSON-왜? (0) | 2021.01.15 |