Czy maszynopis obecnie (lub czy istnieją plany) obsługi operatora bezpiecznego systemu nawigacji?.
to znaczy:
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
Jest też bardziej popularna nazwa tego operatora (trudno google znaleźć).
typescript
Marty Pitt
źródło
źródło
property ?? property2
, ale gdybyś próbowałproperty.company ?? property1.company
iproperty
był zerowy, dostanieszNullReferenceException
Odpowiedzi:
Aktualizacja : jest obsługiwany od TypeScript 3.7 i nazywa się Opcjonalne tworzenie łańcuchów : https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
Nie mogę znaleźć żadnego odniesienia do tego w specyfikacji języka TypeScript .
Jeśli chodzi o to, co wywołać tego operatora w CoffeeScript, nazywa się to operatorem egzystencjalnym (w szczególności „wariantem akcesorium” operatora egzystencjalnego).
Z dokumentacji CoffeeScript na temat operatorów :
Zatem wariant akcesorium operatora egzystencjalnego wydaje się właściwym sposobem na odniesienie się do tego operatora; i wydaje się, że TypeScript obecnie go nie obsługuje (chociaż inni wyrazili chęć takiej funkcjonalności ).
źródło
Nie tak fajny jak singiel?, Ale działa:
Możesz użyć dowolnej liczby &&:
źródło
Jest to zdefiniowane w specyfikacji opcjonalnego łańcucha ECMAScript, więc prawdopodobnie powinniśmy odwoływać się do opcjonalnego łańcucha podczas omawiania tego. Prawdopodobne wdrożenie:
Krótko mówiąc o tym, że zespół TypeScript czeka na doprecyzowanie specyfikacji ECMAScript, więc ich implementacja może być niezłomna w przyszłości. Gdyby coś zaimplementowali teraz, skończyłoby się to poważnymi zmianami, gdyby ECMAScript przedefiniował ich specyfikację.
Zobacz opcjonalną specyfikację łączenia
Tam, gdzie coś nigdy nie będzie standardowym skryptem JavaScript, zespół TypeScript może wdrożyć, co uzna za stosowne, ale w przypadku przyszłych dodatków ECMAScript chcą zachować semantykę, nawet jeśli dają wczesny dostęp, tak jak w przypadku wielu innych funkcji.
Short Cuts
Dostępne są więc wszystkie operatory JavaScript w funky, w tym konwersje typów, takie jak ...
Rozwiązanie ręczne
Ale wracając do pytania. Mam tępy przykład tego, jak możesz zrobić podobną rzecz w JavaScript (i dlatego TypeScript), chociaż zdecydowanie nie sugeruję, że jest to wdzięczne, ponieważ funkcja, której naprawdę szukasz.
Więc jeśli
foo
toundefined
wynik jestundefined
i jeślifoo
jest zdefiniowany i ma właściwość o nazwiebar
, która ma wartość, wynik jest, że wartość.I umieścić przykład na JSFiddle .
Wygląda to dość szkicowo w przypadku dłuższych przykładów.
Funkcja łańcucha
Jeśli desperacko oczekujesz krótszej wersji, gdy specyfikacja wciąż jest w powietrzu, w niektórych przypadkach używam tej metody. Ocenia wyrażenie i zwraca wartość domyślną, jeśli łańcuch nie może być spełniony lub kończy się na wartości zerowej / niezdefiniowanej (zwróć uwagę, że
!=
tutaj jest to ważne, nie chcemy używać,!==
ponieważ chcemy tutaj trochę pozytywnego żonglowania).źródło
(this.loop || {}).nativeElement
powiedzenieProperty 'nativeElement' does not exist on type '{}'. any
this.loop
typeof angular.io/api/core/ElementRef{}
, lub 2) użyć asercji typu, aby wyciszyć kompilator.foo
jest to rzeczywiście przydatny obiekt:(foo || {}).bar
generalnie nie będzie się kompilował w maszynopisie, ponieważ{}
nie będzie tego samego typu cofoo
. Właśnie tego problemu @ VeganHunter chce uniknąć.Aktualizacja: Tak, teraz jest obsługiwany!
Właśnie został wydany z TypeScript 3.7: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
Nazywa się to opcjonalnym łańcuchem : https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#optional-chaining
Dzięki temu:
jest równa:
Stara odpowiedź
Na github jest otwarta prośba o tę funkcję, gdzie możesz wyrazić swoją opinię / pragnienie: https://github.com/Microsoft/TypeScript/issues/16
źródło
Edytuj 13 listopada 2019!
Od 5 listopada 2019 r. Dostarczono TypeScript 3.7, który obsługuje
?.
opcjonalnego operatora łączenia aining !!!https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining
Tylko do celów historycznych:
Edytuj: Zaktualizowałem odpowiedź dzięki komentarzowi Fracza.
Wydany TypeScript 2.0
!.
To nie to samo co?.
(Safe Navigator w C #)Zobacz tę odpowiedź, aby uzyskać więcej informacji:
https://stackoverflow.com/a/38875179/1057052
To tylko powie kompilatorowi, że wartość nie jest pusta ani niezdefiniowana. To nie sprawdzi, czy wartość jest pusta czy niezdefiniowana.
Operator asercji typu non-null
źródło
?
ponieważ zapewnia, że wartość jest zdefiniowana.?
oczekuje się, że po cichu zawiedzie / oceni się na fałsz. W każdym razie dobrze wiedzieć.Opcjonalny operator łańcuchowy Elvis (?.) Jest obsługiwany w TypeScript 3.7.
Możesz go użyć do sprawdzenia wartości null:
cats?.miows
zwraca null, jeśli koty są null lub niezdefiniowane.Możesz go również użyć do opcjonalnego wywoływania metod:
cats.doMiow?.(5)
wywoła doMiow, jeśli istnieje.Dostęp nieruchomość jest również możliwe:
cats?.['miows']
.Odniesienie: https://devblogs.microsoft.com/typescript/announcing-typescript-3-7-beta/
źródło
?:
. Czy masz referencje?Operator
?.
nie jest obsługiwany w wersji 2.0 .Używam więc następującej funkcji:
użycie wygląda następująco:
ponadto możesz ustawić wartość domyślną:
Działa naprawdę dobrze z IntelliSense w Visual Studio.
źródło
elvis<T>
;-)W końcu jest tutaj!
Oto kilka przykładów:
Ale to nie działa dokładnie tak, jak twoje założenie.
Zamiast oceny
do tego małego fragmentu kodu wszyscy jesteśmy przyzwyczajeni do pisania
faktycznie ocenia
który działa dla wszystkich wartości falsey, takich jak pusty ciąg, 0 lub fałsz.
Po prostu nie mam wyjaśnienia, dlaczego go nie kompilują
foo == null
źródło
Stworzyliśmy tę metodę wykorzystania podczas pracy na Phonetradr, która umożliwia bezpieczny dostęp do głębokich właściwości za pomocą Typescript:
źródło
return this.entry.fields.featuredImage.fields.file.url;
Zasadniczo nie zalecam tego podejścia (uważaj na problemy z wydajnością), ale możesz użyć operatora rozprzestrzeniania, aby płytko sklonować obiekt, na którym możesz następnie uzyskać dostęp do właściwości.
Działa to, ponieważ typ „firstName” jest „propagowany” przez.
Użyję tego najczęściej, gdy mam
find(...)
wyrażenie, które może zwrócić null i potrzebuję z niego jednej właściwości:Mogą istnieć pewne przypadki krawędzi ze sposobem, w jaki typ maszynowy określa typy, i to się nie kompiluje, ale ogólnie powinno to działać.
źródło
Nazywa się to opcjonalnym łańcuchem i znajduje się w maszynowym rozdziale 3.7
źródło
Jak już wcześniej wspomniano, wciąż jest rozważany, ale od kilku lat jest martwy w wodzie .
Opierając się na istniejących odpowiedziach, oto najbardziej zwięzła wersja podręcznika, jaką mogę wymyślić:
jsfiddle
Po prostu dyskretnie zawodzi w przypadku brakujących błędów właściwości. Wraca do standardowej składni do określania wartości domyślnej, którą można również całkowicie pominąć.
Chociaż działa to w prostych przypadkach, jeśli potrzebujesz bardziej skomplikowanych rzeczy, takich jak wywołanie funkcji, a następnie uzyskanie dostępu do właściwości wyniku, wszystkie inne błędy również zostaną połknięte. Zły projekt.
W powyższym przypadku zoptymalizowana wersja drugiej odpowiedzi zamieszczonej tutaj jest lepszą opcją:
jsfiddle
Bardziej złożony przykład:
Możesz także przejść w drugą stronę i użyć czegoś takiego jak Lodash ”
_.get()
. Jest zwięzły, ale kompilator nie będzie w stanie ocenić poprawności użytych właściwości:źródło
Jeszcze nie (we wrześniu 2019 r.), Ale ponieważ „bezpieczny operator nawigacji” znajduje się obecnie na etapie 3 , jest on implementowany w TypeScript.
Obejrzyj ten problem, aby uzyskać aktualizacje:
https://github.com/microsoft/TypeScript/issues/16
Kilka silników ma wczesne wdrożenia:
JSC: https://bugs.webkit.org/show_bug.cgi?id=200199
V8: https://bugs.chromium.org/p/v8/issues/detail?id=9553
SM: https://bugzilla.mozilla.org/show_bug.cgi?id=1566143
(przez https://github.com/tc39/proposal-optional-chaining/issues/115#issue-475422578 )
Możesz teraz zainstalować wtyczkę, aby ją obsługiwać:
W twoim pliku tsconfig.json:
Oczekuję, że ta odpowiedź będzie nieaktualna w ciągu najbliższych 6 miesięcy, ale mam nadzieję, że w międzyczasie komuś pomoże.
źródło
_.get(obj, 'address.street.name')
działa świetnie dla JavaScript, gdzie nie masz żadnych typów. Ale do TypeScript potrzebujemy prawdziwego operatora Elvisa!źródło