[typescript] Typescript에서! 멤버를 역 참조 할 때 (느낌표 / 뱅) 연산자?

tslint 규칙의 소스 코드를 볼 때 다음과 같은 진술을 보았습니다.

if (node.parent!.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

!뒤에 연산자를 주목하십시오 node.parent. 흥미 롭습니다!

먼저 현재 설치된 TS (1.5.3) 버전으로 파일을 로컬로 컴파일하려고했습니다. 결과 오류는 뱅의 정확한 위치를 가리 켰습니다.

$ tsc --noImplicitAny memberAccessRule.ts
noPublicModifierRule.ts(57,24): error TS1005: ')' expected.

다음으로 최신 TS (2.1.6)로 업그레이드하여 문제없이 컴파일했습니다. TS 2.x의 기능인 것 같습니다. 그러나 트랜스 필은 강타를 완전히 무시하여 다음 JS를 생성했습니다.

if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) {
    return;
}

내 Google fu는 지금까지 실패했습니다.

TS의 느낌표 연산자는 무엇이며 어떻게 작동합니까?



답변

이것이 null이 아닌 어설 션 연산자입니다. 그것은 컴파일러에게 할 수있는 방법이다 “이 표현이 될 수 없다 null거나 undefined그래서 존재의 가능성에 대해 불평하지 않는, 여기 nullundefined.” 때로는 유형 검사기가 자체 결정을 할 수 없습니다.

여기에 설명되어 있습니다 :

새로운 !post-fix expression operator는 타입 체커가 그 사실을 결론 지을 수없는 상황에서 피연산자가 널이 아니며 정의되지 않은 것을 주장하는데 사용될 수있다. 특히, 조작 x!xwith nullundefinedexclude 유형의 값을 생성합니다 . 형태의 주장 비슷한 유형 <T>xx as T상기 !비 – 널 어서 오퍼레이터는 단순히 발광 자바 스크립트 코드를 제거한다.

나는 그 설명에서 “어설 션”이라는 용어를 잘못 사용하는 것을 발견했다. 테스트를 수행 한다는 의미가 아니라 개발자가 주장하고 있다는 의미에서 “어설 션”입니다 . 마지막 줄은 실제로 JavaScript 코드가 생성되지 않음을 나타냅니다.


답변

루이스의 대답은 훌륭하지만 간결하게 요약하려고 노력했습니다.

뱅 연산자는 컴파일러가 “널 (null) 아님”제약 조건을 일시적으로 완화하도록 요구합니다. 그것은 컴파일러에게 “개발자로서이 변수가 현재 널 (null)이 될 수 없다는 것을 당신보다 잘 알고 있습니다”라고 말합니다.


답변