{
"strict": {
"description": "Enable all strict type checking options.",
"type": "boolean",
"default": false,
"markdownDescription": "Enable all strict type checking options.\n\nSee more: https://www.typescriptlang.org/tsconfig#strict"
},
}
Enable all strict type checking options.
- —noImplicitAny
- —noImplicitThis
- —strictNullChecks
- —strictFunctionTypes
- —strictPropertyInitialization
- —strictBindCallApply
- —alwaysStrict
Raise error on expressions and declarations with an implied any type.
명시적이지 않게 any 타입을 사용하여 표현식과 선언에 사용하면 에러를 발생
function noImplicitAnyTestFunc(arg) {
console.log(arg);
}
//(parameter) arg: any
//'arg' 매개 변수에는 암시적으로 'any' 형식이 포함됩니다.ts(7006)
Suppress —noImplicitAny errors for indexing objects lacking index signatures.
See issue #1232 for more details.
noImplicitAny 사용할 때, 인덱스 객체에 인덱스 signature 가 없는 경우 오류가 발생하는 데 이를 예외 처리한다.
var obj = {
bar: 10
};
obj['foo'] = 10;
// '"foo"' 형식의 식을 '{ bar: number; }' 인덱스 형식에 사용할 수 없으므로 요소에 암시적으로 'any' 형식이 있습니다.
// '{ bar: number; }' 형식에 'foo' 속성이 없습니다.ts(7053)
obj['bar'] = 10; // okay
obj.baz = 10;
// any
// '{ bar: number; }' 형식에 'baz' 속성이 없습니다.ts(2339)
Raise error on this expressions with an implied any type.
명시적이지 않게 any 타입을 사용하여, this 표현식에 사용하면 에러를 발생시킴
function noImplicitThisTestFunc(name: string, age: number) {
this.name = name;
this.age = age;
return this;
// any
// 'this'에는 형식 주석이 없으므로 암시적으로 'any' 형식이 포함됩니다.ts(2683)
}
console.log(noImplicitThisTestFunc.call({ height: 160 }, 'Mark', 36));
console.log(noImplicitThisTestFunc.call({ height: 170 }, 'Mark', 36));
console.log(noImplicitThisTestFunc.call({ height: 180 }, 'Mark', 36));
function noImplicitThisTestFunc(this, name: string, age: number) {
// (parameter) this: any
// 'this' 매개 변수에는 암시적으로 'any' 형식이 포함됩니다.ts(7006)
this.name = name;
this.age = age;
return this;
}
class NoImplicitThisTestClass {
private _name: string;
private _age: number;
constructor(name: string, age: number) {
this._name = name;
this._age = age;
}
public print(this: NoImplicitThisTestClass) {
console.log(this._name, this._age);
}
}
new NoImplicitThisTestClass('Mark', 36).print();
In 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 (this one exception being that undefined is also assignable to void).
- strictNullChecks 모드에서는 null 및 undefined 값이 모든 유형의 도메인에 속하지 않으며, 그 자신을 타입으로 가지거나, any 일 경우에만 할당이 가능함
- 한 가지 예외는 undefined 에 void 할당 가능
const a: number = null;
// 'null' 형식은 'number' 형식에 할당할 수 없습니다.ts(2322)
const b: string = undefined;
// 'undefined' 형식은 'string' 형식에 할당할 수 없습니다.ts(2322)
const c: number | null = null;
const d: any = null;
const e: any = undefined;
const f: void = undefined;
Disable bivariant parameter checking for function types.
함수 타입에 대한 bivariant 매개변수 검사를 비활성화
Question : Which of the following types could be subtypes of
Dog -> Dog
?
Greyhound → Greyhound
Greyhound → Animal
Animal → Animal
Animal → Greyhound
(Animal -> Geryhound) <: (Dog -> Dog)
const button = document.querySelector('#id') as HTMLButtonElement;
button.addEventListener('keydown', (e: MouseEvent) => {});
// 이 호출과 일치하는 오버로드가 없습니다.
// 오버로드 1/2('(type: "keydown", listener: (this: HTMLButtonElement, ev: KeyboardEvent) => any, options?: boolean | AddEventListenerOptions | undefined): void')에서 다음 오류가 발생했습니다.
// '(e: MouseEvent) => void' 형식의 인수는 '(this: HTMLButtonElement, ev: KeyboardEvent) => any' 형식의 매개 변수에 할당될 수 없습니다.
// 'e' 및 'ev' 매개 변수의 형식이 호환되지 않습니다.
// 'KeyboardEvent' 형식에 'MouseEvent' 형식의 button, buttons, clientX, clientY 외 12개 속성이 없습니다.
// 오버로드 2/2('(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void')에서 다음 오류가 발생했습니다.
// '(e: MouseEvent) => void' 형식의 인수는 'EventListenerOrEventListenerObject' 형식의 매개 변수에 할당될 수 없습니다.
// '(e: MouseEvent) => void' 형식은 'EventListener' 형식에 할당할 수 없습니다.
// 'e' 및 'evt' 매개 변수의 형식이 호환되지 않습니다.
Ensure non-undefined class properties are initialized in the cnostructor
정의되지 않은 클래스의 속성이 생성자에게 초기화되었는지 확인함.
이 옵션을 사용하려면 —strictNullChecks 를 사용하도록 설정해야 함.
class Person {
private _name: string;
// 속성 '_name'은(는) 이니셜라이저가 없고 생성자에 할당되어 있지 않습니다.ts(2564)
private _age: number;
// 속성 '_age'은(는) 이니셜라이저가 없고 생성자에 할당되어 있지 않습니다.ts(2564)
constructor() {}
public print() {
console.log(this._name, this._age);
}
}
constructor 에서 초기값을 할당한 경우 ⇒ 정상
class Person {
private _name: string;
private _age: number;
constructor(name: string, age: number) {
this._name = name;
this._age = age;
}
public print() {
console.log(this._name, this._age);
}
}
constructor 에서 안하는 경우
class Person {
private _name!: string;
private _age!: number;
public async initialize(name: string, age: number) {
this._name = name;
this._age = age;
}
public print() {
console.log(this._name, this._age);
}
}
Enable stricter checking of the bind, call, and apply methods on functions.
bind, call, apply 에 대한 엄격한 검사 수행
Parse in strict mode and emit “use strict” for each source file
각 소스 파일에 대해 JavaScript 의 strict mode 로 코드를 분석하고, “엄격하게 사용”을 해제함
var e1 = 015;
// ECMAScript 5 이상을 대상으로 하는 경우 8진수 리터럴을 사용할 수 없습니다. '0o15' 구문을 사용하세요.ts(1085)
var e2 = { p: 1, p: 2 };
// 개체 리터럴은 이름이 같은 여러 속성을 가질 수 없습니다.ts(1117)
var e3;
delete e3;
// strict 모드에서는 식별자에 대해 'delete'를 호출할 수 없습니다.ts(1102)
// 'delete' 연산자의 피연산자는 속성 참조여야 합니다.ts(2703)
syntax 에러가 ts error로 나옴
컴파일된 JavaScript 파일에 “use strict” 추가됨.