Typescript가 현재 안전한 탐색 연산자를 지원합니까 (또는 계획이 있습니까)?.
즉 :
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
또한이 연산자의 더 일반적인 이름이 있습니까? (구글 적으로 구글하기가 어렵습니다).
답변
업데이트 : TypeScript 3.7부터 지원되며 선택적 체인 이라고합니다 : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
TypeScript 언어 사양 에서 그것에 대한 참조를 찾을 수 없습니다 .
CoffeeScript에서이 연산자를 호출 할 때까지이를 존재 연산자 (특히, 존재 연산자 의 “접근 변형 자”)라고합니다.
에서 연산자에 커피 스크립트의 설명서 :
실재 연산자의 접근 자 변형을
?.
사용하여 일련의 속성에서 null 참조를 흡수 할 수 있습니다..
기본 값이 null 이거나 정의되지 않은 경우 도트 접근 자 대신 사용하십시오 .
따라서 실재 연산자 의 접근 자 변형 이이 연산자를 참조하는 적절한 방법 인 것 같습니다. TypeScript는 현재 그것을 지원하지 않는 것으로 보입니다 ( 다른 사람들 이이 기능에 대한 욕구를 표현 했지만 ).
답변
단일만큼 좋지는 않지만 작동합니다.
var thing = foo && foo.bar || null;
원하는만큼 &&을 (를) 사용할 수 있습니다.
var thing = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;
답변
이는 ECMAScript 선택적 체인 사양에 정의되어 있으므로 이에 대해 논의 할 때 선택적 체인을 참조해야 합니다. 아마도 구현 :
const result = a?.b?.c;
이것의 길고 짧은 것은 TypeScript 팀이 ECMAScript 사양이 강화되기를 기다리고 있기 때문에 향후 구현이 중단되지 않을 수 있다는 것입니다. 만약 그들이 지금 무언가를 구현한다면, ECMAScript가 그들의 사양을 재정의한다면 큰 변화가 필요할 것입니다.
선택적 체인 사양 참조
어떤 것이 표준 JavaScript가 될 수없는 경우 TypeScript 팀은 적합하다고 생각되는대로 구현할 수 있지만 향후 ECMAScript 추가를 위해 다른 많은 기능과 마찬가지로 조기 액세스를 제공하더라도 의미를 보존하려고합니다.
바로 가기
따라서 다음과 같은 유형 변환을 포함하여 모든 JavaScript 펑키 연산자를 사용할 수 있습니다.
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
수동 솔루션
그러나 다시 질문으로 돌아갑니다. JavaScript (유형 TypeScript)에서 비슷한 작업을 수행하는 방법에 대한 모호한 예가 있지만 실제로 그 기능이 우아하다는 것은 아닙니다.
(foo||{}).bar;
그래서 경우가 foo
있습니다 undefined
결과 undefined
및 경우 foo
정의라는 이름의 속성이되는 bar
값을 가지고, 결과는 그 값입니다.
나는 넣어 JSFiddle에 예 .
더 긴 예제에서는 상당히 스케치처럼 보입니다.
var postCode = ((person||{}).address||{}).postcode;
체인 기능
사양이 아직 공개되지 않은 상태에서 더 짧은 버전을 원한다면 필자는이 방법을 사용합니다. 체인을 만족시킬 수 없거나 null / undefined로 끝나는 경우 표현식을 평가하고 기본값을 반환합니다 ( !=
여기서는 중요합니다. 여기서 약간의 긍정적 인 저글링을 원하므로 사용하고 싶지 않습니다!==
).
function chain<T>(exp: () => T, d: T) {
try {
let val = exp();
if (val != null) {
return val;
}
} catch { }
return d;
}
let obj1: { a?: { b?: string }} = {
a: {
b: 'c'
}
};
// 'c'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {
a: {}
};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = null;
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
답변
업데이트 : 예, 이제 지원됩니다!
방금 TypeScript 3.7과 함께 출시되었습니다 : https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
옵션 체인 이라고합니다 : https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining
그것으로 다음과 같이 :
let x = foo?.bar.baz();
다음과 같습니다.
let x = (foo === null || foo === undefined) ?
undefined :
foo.bar.baz();
이전 답변
당신이 당신의 의견 / 욕망을 음성 수 GitHub의에이를위한 오픈 기능 요청이 있습니다 : https://github.com/Microsoft/TypeScript/issues/16
답변
2019 년 11 월 13 일 수정!
2019 년 11 월 5 일 현재 TypeScript 3.7이 출시되었으며 이제 ?.
선택적 체인 연산자 ????? !!!를 지원 합니다 !!!
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
역사적인 목적으로 만 :
편집 : fracz 의견 덕분에 답변을 업데이트했습니다.
TypeScript 2.0 출시 (C #의 Safe Navigator) !.
와 동일하지 않음?.
자세한 내용은이 답변을 참조하십시오.
https://stackoverflow.com/a/38875179/1057052
이것은 컴파일러에게 그 값이 널 (null)이거나 정의되지 않았 음을 알려줍니다. 이 것 없는 값이 null이거나 정의되어 있는지 확인하세요.
// 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
}
답변
Elvis (?.) 옵션 체인 연산자는 TypeScript 3.7에서 지원됩니다.
이를 사용하여 널값을 확인할 수 있습니다 cats?.miows
. cats가 널이거나 정의되지 않은 경우 널을 리턴합니다.
선택적 메소드 호출에 사용할 수도 cats.doMiow?.(5)
있습니다. 존재하는 경우 doMiow를 호출합니다.
속성 액세스도 가능합니다 : cats?.['miows']
.
참조 : https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
답변
?.
TypeScript 버전 2.0 에서는 연산자 가 지원되지 않습니다 .
그래서 나는 다음 기능을 사용합니다 :
export function o<T>(someObject: T, defaultValue: T = {} as T) : T {
if (typeof someObject === 'undefined' || someObject === null)
return defaultValue;
else
return someObject;
}
사용법은 다음과 같습니다.
o(o(o(test).prop1).prop2
또한 기본값을 설정할 수 있습니다.
o(o(o(o(test).prop1).prop2, "none")
Visual Studio에서 IntelliSense와 잘 작동합니다.