TypeScript 또는 JavaScript 유형 캐스팅


185

TypeScript 또는 Javascript에서 유형 캐스팅을 어떻게 처리합니까?

다음 TypeScript 코드가 있다고 가정 해보십시오.

module Symbology { 

    export class SymbolFactory { 

        createStyle( symbolInfo : SymbolInfo) : any { 
            if (symbolInfo == null)
            {
                 return null;
            }

            if (symbolInfo.symbolShapeType === "marker") {      

                // how to cast to MarkerSymbolInfo          
                return this.createMarkerStyle((MarkerSymbolInfo) symbolInfo);
            }                                  
        }

        createMarkerStyle(markerSymbol : MarkerSymbolInfo ): any { 
            throw "createMarkerStyle not implemented";
        }              

    }
}

SymbolInfo기본 클래스는 어디에 있습니까 ? 어떻게에서 타입 캐스팅 처리하나요 SymbolInfo까지를 MarkerSymbolInfo타이프 또는 자바 스크립트?

답변:


284

다음과 같이 캐스팅 할 수 있습니다.

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

또는 tsx 모드와 호환되도록하려면 다음과 같이하십시오.

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

이것은 컴파일 타임 캐스트이며 런타임 캐스트가 아니라는 것을 기억하십시오.


10
이제 doc에서 섹션 4.13의 Type Assertions를 참조하십시오.
Klaus Nji

이 답변은 더 이상 타입 스크립트에서 타입 어설 션의 전체 그림을 제공하지 않지만 Alex의 답변은보다 완전한 그림을 제공하며 허용되는 답변이어야합니다.
Kristoffer Dorph

@KristofferDorph이 답변은 4 살입니다. 작성 당시 TypeScript는 0.8.1 버전이므로 당시 정답이었습니다. JSX 지원은 3 년 후에 만 ​​포함되었습니다.
blorkfish 2012 년

@blorkfish는 사실이지만 시간을 따르는 것이 좋습니다. 그래서 오늘 같은 질문을하는 사람들은 4 년 전이 아니라 현재 답변을 얻습니다 :-)
Kristoffer Dorph

160

이것을 TypeScript에서 타입 어설 션 이라고하며 TypeScript 1.6부터이를 표현하는 두 가지 방법이 있습니다.

// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;

// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;

두 대안 모두 기능적으로 동일합니다 . -syntax 를 도입 한 이유 as는 원래 구문이 JSX 와 충돌 했기 때문 입니다. 여기서 디자인 토론을 참조 하십시오 .

당신이 선택할 수있는 위치에 있다면, 당신이 더 편안하다고 느끼는 구문을 사용하십시오. 나는 개인적 as으로 읽고 쓰는 것이 더 유창하다고 느끼기 때문에 -syntax를 선호합니다 .


2
객체를 다른 유형으로 변환했다는 것을 타이프 스크립트로 표시하려면 어떻게해야합니까? 예를 들어, type2를 반환하는 func는 그 안에 http가 유형 1을 가져오고 변환하는 논리를 수행하고 type1 이었지만 지금은 type2 인 것을 반환합니까?
Tony Gutierrez

@TonyGutierrez 어떻게 변환합니까?
Alex

1
기본적으로 하나의 속성을 사용하여 수정하십시오. 내가 찾은 유일한 방법은 새 var (type2)를 만들고 type1var에서 소품을 복사 한 다음 반환하는 것입니다. type1을 수정하여 반환 할 수 없거나 "캐스팅 할 수 없음"오류가 발생합니다.
Tony Gutierrez

1

typescript에서는 instanceofif 문을 체크인 할 수 있으며 Typed속성 을 사용하여 동일한 변수에 액세스 할 수 있습니다.

MarkerSymbolInfo라는 속성 이 있다고 가정 해 봅시다 marker. 다음을 수행 할 수 있습니다.

if (symbolInfo instanceof MarkerSymbol) {
    // access .marker here
    const marker = symbolInfo.marker
}

변수를 다른 변수 이름에 다시 할당 할 필요없이 동일한 변수를 사용하여 변수의 인스턴스를 얻는 것은 약간의 트릭입니다.

자세한 내용은 다음 두 가지 리소스를 확인하십시오.

TypeScript 인스턴스JavaScript 인스턴스

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.