왜 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가 이를 좋아하지 않는 것 같습니다.
TL;DR
instanceof
는 인터페이스나 타입 에일리어스가 아닌 클래스와 연동됩니다.
TypeScript는 무엇을 의미합니까?
문제는 JavaScript의 구성체이며 JavaScript에서는instanceof
오른쪽 오퍼랜드 값이 필요합니다.구체적으로는x instanceof Foo
JavaScript는 실행 시 체크를 수행하여 실행 여부를 확인합니다.Foo.prototype
원형 사슬의 어디에나 존재한다x
.
단, TypeScript에서는interface
에는 방출이 없습니다.에 대해서도 마찬가지다.type
에일리어스그 말은 둘 다Foo
도 아니다Foo.prototype
런타임에 존재하기 때문에 이 코드는 반드시 실패합니다.
TypeScript는 이것이 작동하지 않을 수 있음을 알려주고 있습니다. Foo
단순한 타입일 뿐이지, 전혀 가치가 아닙니다!
만약 다른 언어에서 온다면, 이곳에서의 수업을 이용하려고 했을지도 모릅니다.클래스는 실행 시 값을 생성하지만, 이에 대한 몇 가지 참고 사항이 있습니다.
"그 대신 제가 할 수 있는 게 뭐죠?instanceof
내가 여전히 원한다면type
또는interface
?"
타입 가드 및 사용자 정의 타입 가드를 조사할 수 있습니다.
"하지만 만약 내가 그냥 다른 곳에서interface
에 대해서class
?"
다른 사용자로부터 전환하고 싶을 수 있습니다.interface
에 대해서class
단, TypeScript의 Structural Type 시스템(사물이 주로 쉐이핑 기반인 경우)에서는 특정 클래스와 동일한 모양의 개체를 생성할 수 있습니다.
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
TypeScript의 구조적인 타입을 이용하고 있는 경우는, 그 타입에 대해서는 별로 알 수 없습니다.
인터페이스를 사용하여 런타임에 유형 검사를 수행하려면 확인하는 인터페이스의 속성/기능이 다를 경우 유형 가드를 사용합니다.
예
let pet = getSmallPet();
if ((pet as Fish).swim) {
(pet as Fish).swim();
} else if ((pet as Bird).fly) {
(pet as Bird).fly();
}
Daniel Rosenwasser가 옳고 멋질지도 모르지만 나는 그의 대답을 수정하고 싶다.x의 인스턴스를 완전히 확인할 수 있습니다. 코드 스니펫을 참조하십시오.
그러나 x = y를 할당하는 것은 마찬가지로 쉽습니다.x는 C의 모양만 가지고 있기 때문에 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
오브젝트가 인터페이스 시그니처에 준거하고 있는지 여부를 체크하는 경우, 적절한 접근법은 "type 술어"를 사용하는 것을 고려하고 있다고 생각합니다.https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates
필요한 요소가 오브젝트 내에 있는지 확인하기 위해 in 연산자 좁기를 사용할 수 있습니다.
이 방법을 사용하면 x가 문자열인지 Foo인지 확인할 수 있습니다.
if ('abcdef' in x) {
// x is instance of Foo
}
instanceof
보통 정답입니다.
는, 만, 둘 다 원초 타입으로 작업하고 .instanceof Number
★★★★★★★★★★★★★★★★★」instanceof number
컴파일러ts "ts " 했습니다.
TS2322: Type 'Number' is not assignable to type 'number'.
TS2693: 'number' only refers to a type, but is being used as a value here.
typeof
는, 원시 되고 있는 입니다.
if (typeof value === 'number') {this.propertyValue = value}
언급URL : https://stackoverflow.com/questions/46703364/why-does-instanceof-in-typescript-give-me-the-error-foo-only-refers-to-a-ty
'programing' 카테고리의 다른 글
스프링 부트: 여러 SLF4J 바인딩 (0) | 2023.04.02 |
---|---|
JSX React HTML5 입력 슬라이더가 작동하지 않음 (0) | 2023.04.02 |
create-react-app 빌드 스크립트를 실행할 때 build .env 변수를 설정하는 방법은 무엇입니까? (0) | 2023.04.02 |
인터페이스 주입 및 공통 클래스 (0) | 2023.04.02 |
[_NSCF Number length]: 인식할 수 없는 실렉터가 인스턴스 UITableView로 전송되었습니다. (0) | 2023.03.28 |