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
그래서 존재의 가능성에 대해 불평하지 않는, 여기 null
나 undefined
.” 때로는 유형 검사기가 자체 결정을 할 수 없습니다.
여기에 설명되어 있습니다 :
새로운
!
post-fix expression operator는 타입 체커가 그 사실을 결론 지을 수없는 상황에서 피연산자가 널이 아니며 정의되지 않은 것을 주장하는데 사용될 수있다. 특히, 조작x!
은x
withnull
및undefined
exclude 유형의 값을 생성합니다 . 형태의 주장 비슷한 유형<T>x
과x as T
상기!
비 – 널 어서 오퍼레이터는 단순히 발광 자바 스크립트 코드를 제거한다.
나는 그 설명에서 “어설 션”이라는 용어를 잘못 사용하는 것을 발견했다. 테스트를 수행 한다는 의미가 아니라 개발자가 주장하고 있다는 의미에서 “어설 션”입니다 . 마지막 줄은 실제로 JavaScript 코드가 생성되지 않음을 나타냅니다.
답변
루이스의 대답은 훌륭하지만 간결하게 요약하려고 노력했습니다.
뱅 연산자는 컴파일러가 “널 (null) 아님”제약 조건을 일시적으로 완화하도록 요구합니다. 그것은 컴파일러에게 “개발자로서이 변수가 현재 널 (null)이 될 수 없다는 것을 당신보다 잘 알고 있습니다”라고 말합니다.