programing

왜 TypeScript의 'instanceof'에서 "Foo'는 유형만을 나타낼 뿐 여기서 값으로 사용되고 있습니다."라는 오류가 표시되는가?

codeshow 2023. 4. 2. 11:40
반응형

왜 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 FooJavaScript는 실행 시 체크를 수행하여 실행 여부를 확인합니다.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어느 쪽이든 반대의 결과를 얻을 수 있습니다.그렇게instanceofTypeScript의 구조적인 타입을 이용하고 있는 경우는, 그 타입에 대해서는 별로 알 수 없습니다.

인터페이스를 사용하여 런타임에 유형 검사를 수행하려면 확인하는 인터페이스의 속성/기능이 다를 경우 유형 가드를 사용합니다.

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

반응형