[typeScript] compileOptions -strict

M_yeon·2022년 8월 12일
1

typeScript

목록 보기
2/3
post-thumbnail

Enable all strict type checking options.

  • --noimplictAny
  • --noimplicitthis
  • --strictNullChecks
  • --strictFunctionTypes
  • --strictpropertyinitialization
  • --strictBindCallApply
  • --alwaysStrict

--noImpIicitAny

Raise error on expressms and declarations with an implied any type
명시적이지 않게 any 타입을 사용하여 표현식과 선언에 사용하면 에러를 발생.

• 타입스크립트가 추론을 실패한 경우, any가 맞으면, any라고 지정하라.
• 아무것도 쓰지 않으면, 에러를 발생시킨다.
• 이 오류를 해결하면, 타입이 추론 되었으므로 any 라고 지정되어 있지 않은 경우는 any 가 아닌 것이다.

noImplicitAny와 관련한 옵션중

 suppressImpIicitAnyIndexErrors

Suppress —nolmplicitAny errors for indexing objects lacking index signatures. See issue #1232 for more details.

nolmplicitAny 사용할 때, 인덱스 객체에 인덱스 signature 가 없는 경우 오류가 발생 하는데 이를 예외처리 합니다.

• obj['foo'] 로 사용할 때, 인덱스 객체라 판단하여, 타입에 인덱스 시그니처가 없는 경우 에러를 발생시킵니다.
•이때 suppresslmplicitAnylndexErrors 옵션을 사용하면, 이런 경우 예외로 간주하여. 에러를 발생시키지 않습니다.

마이너한 설정이라서 noImplicitAny를 사용한 후에 케이스를 찾아서 예외처리를 하고 싶다 할 때 찾아보면 좋을것 같다!
이런것도 전부 다 타이핑 하고 싶다 할때 인덱스 signature로 처리해주는게 맞다고 합니다.


--noImpIicitThis

Raise error on this expressions with an implied any type

명시적이지 않게 any 타입을 사용하여, this 표현식에 사용하면, 에러를 발생합니다.

이런 경우 noImplictAny도 켜고, noImplicitThis도 켜서 this에 특정한 타이핑을 해주는 것이 중요.


•첫번째 매개변수 자리에 this 를 놓고, this 에 대한 타입을 어떤 것이라도 표현하지 않으면, nolmplicitAny가 오류를 발생시킨다.
• JavaScript 에서는 매개변수에 this 를 넣으면, 이미 예약된 키워드라 SyntaxError 를 발생시킨다.(타입스크립트만 가능한 문법)
call / apply / bind 와 같이 this 를 대체하여 함수 콜을 하는 용도로도 쓰입니다.
• 그래서 this 를 any 로 명시적으로 지정하는 것은 합리적입니다.
(물론 구체적인 사용처가 있는 경우 타입을표현하기도 합니다.)


• Class 에서는 this 를 사용하면세 noImplicitThis 와 관련한 에러가 나지 않습니다. (당연)
• Class 에서 constructor 를 제외한 멤버 함수의 첫번째 매개변수도 일반 함수와 마찬가지로 this 를 사용할 수 있습니다.


--strictNullChecks

ln strict null checking mode, the null and undefined values are not in the domain of every type and are only assignable tO themselves and any (the one exception being that undefined is also assignable to void.)

strictNullChecks 옵션을 켜지 않는 경우 typescript에 엄청난 오류가 발생할 수 있다.

strictNullChecks 모드에서는. nullundefined 값이 모든 유형의 도메인에 속하지 않으며, 그 자신을 타입으로 가지거나, any 일 경우에만 할당이 가능합니다.
•한 가지 예외는 undefinedvoid 할당 기능

strictNullChecks 를 적용하지 않으면, 모든 타입은 undefined 값을 가질 수 있습니다.
string 타입을 지정해도. null 혹은 undefined값을 할당할 수 있다는 것입니다.

strictNullChecks 를 적용하면.

  • 모든 타입은 null, undefined 값을 가질 수 없고, 가지려면 union type 을 이용해서 직접 명시 해야 합니다.
  • any 타입은 nullundefined 를 가집니다. 예외적으로 void 타입의 경우 undefined 를 가집니다.
    • strictNullChecks를 적용하지 않고, 어떤 값이 nullundefined 를 가진다는 것을 암묵적으로 인정하고 계속 사용하다 보면,
      정확히 어떤 타입이 오는지를 개발자 스스로가 간과할 수 있습니다.
    • 정말로 nullundefined 를 가질 수 있는 경위 해당 값을 조건부로 제외하고 사용하는 것이 좋습니다.
    • 이 옵션을 켜고 사용하는 경우,
      사용하려는 함수를 선언말 때부터 매개변수와 리턴 값에 정확한 타입을 지정하려는 노력을 기울여야 하고, 기울이게 될 것입니다.

--strictFunctionTypes

Disable bivariant parameter checking for function types.
함수 타입에 대한 bivariant 매개변수 검사를 비활성화합니다?

Question = Dog -> Dog 라는 함수 형태의 서브 타입이 맞는가

매개변수는 같거나 넓어야하고,
리턴 타입은 같거나 하위이어야지 보통 문제가 없다.
리턴타입은 공변적 / 인자 타입은 반공변적이어야 한다.


  • 반환 타입은 공변적 (covariant)
  • 인자 타입은 반공변적(contravariant)
  • 그런데 타입스크립트에서 인자 타입은 공변적이면서, 반공변적인게 문제!
    이 문제를 해결하는 옵션이 strictFunctionTypes
  • 옵션을 켜면, 에러가 안나던걸 에러 나게 함.


이전에는 위와 같은 코드도 에러를 발생시키지 않았지만, 이제는 에러가 발생하게 됩니다.


--strictPropertyInitialization

Ensure non-undefined class properties are initialized in the constructor.

정의되지 않은 클래스의 속성이 생성자에서 초기화되었는지 확인합니다.
이 옵션을 사용하려면 —stritNullChecksS를 사용하도록 설정해야 합니다.


constructor에서 초기 값을 할당한 경우 => 정상


constructor에서 초기 값을 할당하지 않는 경우

  • 보통 다른 함수로 이니셜라이즈 하는 경우(async함수)
  • constructor에는 async를 사용할 수 없다.아래 사진처럼 initialize async 함수를 만들어서 사용하면 된다.

    name과 age뒤에 !를 사용함으로써 "나는 어디선가 개발자가 할당을 시킬거야 그러니까 이 에러를 무시해줘" 라고 설정할 수도 있다.

--strictBindCallApply

EnabIe stricter checking Of Of the bind, call, and apply methods on functions.

bind, call, apply 에 대한 더 엄격한 검사 수행

  • Function 의 내장 함수인 bind / call / apply 를 사용할 때,엄격하게 체크하도록 하는 옵션입니다.
  • bind 는 해당 함수안에서 사용할 this와 인자를 설정해주는 역할을 하고,
    call과 apply는 this 와 인자를 설정한 후, 실행까지 합니다.
  • call 과 apply 는 인자를 설정하는 방식에서 차이점이 있습니다.
    • call 은 함수의 인자를 여러 인자의 나열로 넣어서 사용하고,
      apply 는 모든 인자를 배열 하나로 넣어서 사용 합니다.

--alwaysStrict

Parse in strict mode and emit "use strict" for each source file

각 소스 파일에 대해 JavaScript 의 strict mode 로 코드를 분석하고, “엄격하게 사용" 을 해제합니다.

컴파일된 javaScript 파일에 "use strict" 추가됨.


타입스크립트의 타입시스템을 강력하게 사용하려면 이 strict는 필수 옵션입니다.

0개의 댓글