! 오브젝트 메서드 뒤에 typescript가 있는 연산자
나는 목적이 있다.X
방법을 써서getY()
오브젝트 반환Y
방법을 써서a()
, 타이프 스크립트로.이런 표현은 무슨 뜻입니까?
X.getY()!.a()
제 생각엔...!
연산자는 null과 대조하기 위해 사용되는데 구체적으로 어떻게 작동합니까?언어에서는 어디에 정의되어 있습니까?
이것은 "Non-Null assertion 연산자"라고 불리며 컴파일러에게 다음과 같이 알려줍니다.x.getY()
는 늘이 아닙니다.
이것은 새로운 타이프스크립트 2.0 기능으로, 새로운 기능 페이지에서 읽어보실 수 있습니다.내용은 다음과 같습니다.
새로운 ! post-fix 표현 연산자는 타입 체커가 그 사실을 결론지을 수 없는 컨텍스트에서 피연산자가 null이 아니거나 정의되지 않았다고 주장하기 위해 사용될 수 있습니다.특히, x! 연산은 null 및 defined excluded를 포함하는 x 유형의 값을 생성합니다.T와 같은 x 및 x 형식의 형식 어사션과 마찬가지로 ! non-null 어사션 연산자는 단순히 내보낸 JavaScript 코드에서 제거됩니다.
// Compiled with --strictNullChecks
function validateEntity(e?: Entity) {
// Throw exception if e is null or invalid entity
}
function processEntity(e?: Entity) {
validateEntity(e);
let s = e!.name; // Assert that e is non-null and access name
}
편집
이 기능을 문서화하는 데 문제가 있습니다.Null이 아닌 어설션 연산자를 문서화합니다(!).
null이 아닌 어설션 연산자: !
- TS 컴파일러에게 변수의 값이
null | undefined
- TS 컴파일러에 부족한 지식을 가지고 있을 때 사용합니다.
다음은 동작의 간단한 예를 제시하겠습니다.
let nullable1: null | number;
let nullable2: undefined | string;
let foo = nullable1! // type foo: number
let fooz = nullable2! // type fooz: string
기본적으로는,null | undefined
타입에서
이거 언제 써요?
타이프 스크립트는 이미 타이프 가드를 사용하여 타입을 추론하는 데 매우 능숙합니다.
let nullable: null | number | undefined;
if (nullable) {
const foo = nullable; // ts can infer that foo: number, since if statements checks this
}
다만, 다음과 같은 시나리오가 있는 경우가 있습니다.
type Nullable = null | number | undefined;
let nullable: Nullable;
validate(nullable);
// Here we say to ts compiler:
// I, the programmer have checked this and foo is not null or undefined
const foo = nullable!; // foo: number
function validate(arg: Nullable) {
// normally usually more complex validation logic
// but now for an example
if (!arg) {
throw Error('validation failed')
}
}
제 개인적인 조언은 가능한 한 이 오퍼레이터를 피하라는 것입니다.컴파일러가 코드를 정적으로 체크하도록 합니다.다만, 특히 벤더 코드의 경우는, 이 오퍼레이터를 사용할 필요가 없는 경우가 있습니다.
언급URL : https://stackoverflow.com/questions/38874928/operator-in-typescript-after-object-method
'source' 카테고리의 다른 글
봄에 GET 요구 메서드와 POST 요구 메서드를 조합하다 (0) | 2023.02.26 |
---|---|
스프링 부팅에서 다중 파트 경계를 찾을 수 없으므로 요청이 거부되었습니다. (0) | 2023.02.26 |
Maven - Eclipse에서 관리 버전 재정의 경고 억제 (0) | 2023.02.26 |
AngularJS 왜 스코프가 필요하죠?$140 이내.$on? (0) | 2023.02.26 |
약속의 가치에 접근하려면 어떻게 해야 하나요? (0) | 2023.02.26 |