Wymagane jest ustawienie „Use Strict” w pliku TypeScript?

126

Widziałem posty dotyczące tego, gdzie umieścić wiersz „użyj ścisłego” w pliku kodu TypeScript. Moje pytanie brzmi: po co to w ogóle mieć?

Skoro TypeScript jest już językiem z silną typizacją, co dodaje „ścisłe”?

DeborahK
źródło
12
Podany przez Ciebie link określa, do czego służy „użyj ścisłego” w pliku JavaScript. Moje pytanie dotyczy tego, czy jest on nadal przydatny / potrzebny w pliku TypeScript, w którym edytory obsługujące język TypeScript i Typescript wychwycą większość / wszystkie (?) Problemy, które wyłapią „użyj ścisłego”.
DeborahK
Będziesz go również potrzebował, jeśli "use strict";
budujesz
Nie umieszczaj go w polu TS, dodaj flagę do tsconfig.json --alwaysStrict: Analizuj w trybie ścisłym i emituj „use strict” dla każdego pliku źródłowego
Drenai

Odpowiedzi:

107

Aktualizacje

  • TypeScript 1.8+: "use strict";jest emitowany w modułach ( Czytaj więcej ).
  • TypeScript 2.1+: --alwaysStrictopcja kompilatora analizuje wszystkie pliki w trybie ścisłym i emituje "use strict"na górze wszystkich plików wyjściowych ( Czytaj więcej ).

Listę przykładów można znaleźć, wyszukując w testach TypeScript słowo „w trybie ścisłym”.

Oto kilka przykładów kodu, który zgłasza błąd czasu kompilacji tylko wtedy, gdy "use strict";:

// future reserved keyword not allowed as variable name
var let,
    yield,
    public,
    private,
    protected,
    static,
    implements;

// "delete" cannot be called on an identifier
var a;
delete a;

// octal literals not allowed
03;

Istnieje kilka innych przykładów, w których "use strict";wystąpiłby błąd tylko w czasie wykonywania. Na przykład:

"use strict";
delete Object.prototype;

Osobiście uważam, że nie jest to przydatne w zapobieganiu popełnienia błędów w TypeScript, a dodatkowy szum, który dodaje do pliku, sprawia, że ​​nie zawracam sobie głowy pisaniem go. To powiedziawszy, począwszy od TS 2.1 --alwaysStrictwłączę opcję kompilatora, ponieważ dodaje ona niewielką dodatkową ścisłość bez narzutów związanych z konserwacją kodu.

David Sherret
źródło
Super, że testy jednostkowe TypeScript to obejmują. Sprawdzę to. Dzięki za przykłady. I zgadzam się, że nie włączam go już do naszych „standardów kodowania” dla języka TypeScript.
DeborahK
Zauważ, że jeśli używasz modułów zewnętrznych, dowolny use strictciąg zadeklarowany na początku pliku TS może pojawić się wewnątrz funkcji modułu zamiast na górze pliku, co nieznacznie zmieni semantykę.
billc.cn
na moim komputerze TypeScript 1.4 nie zezwala na literały ósemkowe podczas kierowania na ECMAScript 5 lub nowszy, nawet jeśli nie jest używany"use strict;"
Jeremy
18

Za moje pieniądze, tak ,"use strict"; powinny być zawarte w plikach TypeScript.

Pomijając wpływ czasu kompilacji"use strict"; na Typescript, prawdopodobnie wystąpi wpływ na środowisko wykonawcze, gdy wygenerowany javascript zostanie wykonany:

Jeremy
źródło