[typescript] `is` 키워드는 타이프 스크립트에서 무엇을합니까?

다음과 같은 코드를 발견했습니다.

export function foo(arg: string): arg is MyType {
    return ...
}

나는 is문서 나 구글에서 검색 할 수 없었다 . 꽤 흔한 단어이며 기본적으로 모든 페이지에 나타난다.

그 맥락에서 키워드는 무엇을합니까?



답변

function isString(test: any): test is string{
    return typeof test === "string";
}

function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length); // string function
    }
}
example("hello world");

위의 형식에서 “test is string”형식 술어를 사용합니다 (반환 형식에 부울을 사용하는 대신 isString ()이 호출 된 후 함수가 true를 반환하면 TypeScript는 형식을 문자열로 좁 힙니다.
컴파일러는 foo가 아래 보호 블록 (및 아래 보호 블록에서만)의 문자열이라고 생각할 것입니다 .

{
    console.log("it is a string" + foo);
    console.log(foo.length); // string function
}

타입 술어는 컴파일 타임에만 사용됩니다. 결과 .js 파일 (런타임)은 TYPE을 고려하지 않기 때문에 차이가 없습니다.

아래 네 가지 예에서 차이점을 설명하겠습니다.

예 1 : 위의 예제 코드에는 컴파일 오류 및 런타임 오류가 없습니다.

예 2 : TypeScript가 유형을 문자열로 좁히고 toExponential이 문자열 메서드에 속하지 않는지 확인했기 때문에 아래 예제 코드에는 컴파일 오류 (및 런타임 오류)가 있습니다.

function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length);
        console.log(foo.toExponential(2));
    }
}

예 3 : 아래 예제 코드에는 컴파일 오류가 없지만 TypeScript가 보호되는 블록의 문자열로만 유형을 좁히기 때문에 런타임 오류가 발생하므로 foo.toExponential은 컴파일 오류를 생성하지 않습니다 (TypeScript는 문자열 유형). 그러나 런타임에서 string에는 toExponential 메서드가 없으므로 런타임 오류가 발생합니다.

function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length);
    }
    console.log(foo.toExponential(2));
}

예 4 : “test is string”(유형 술어)을 사용하지 않으면 TypeScript는 보호 된 블록의 유형을 좁히지 않으며 아래 예제 코드에는 컴파일 오류가 없지만 런타임 오류가 발생합니다.

function isString(test: any): boolean{
    return typeof test === "string";
}
function example(foo: any){
    if(isString(foo)){
        console.log("it is a string" + foo);
        console.log(foo.length);
        console.log(foo.toExponential(2));
    }
}

결론은 “test is string”(type predicate)이 컴파일 타임에 사용되어 개발자에게 코드에 런타임 오류가 발생할 가능성이 있음을 알리는 것입니다. 자바 스크립트의 경우 개발자는 컴파일 시간에 오류를 알지 못합니다. 이것이 TypeScript 사용의 장점입니다.


답변

내가 아는 유일한 용도 arg is MyType는 사용자 정의 유형 가드에서 “유형 술어”( )를 지정하는 예입니다.

이 참조에서 사용자 정의 유형 가드를 참조하십시오.

다음은 또 다른 참조입니다.


답변