enum
|
을 사용하자.ts의 매개 변수 속성을 쓰지 말자.
class Person {
name: string; constructor(name: string) {
this.name = name;
}
}
class Person {
constructor(public name: string) {}
}
namespace
, /// <reference path="other.ts"/>
네임스페이스와 트리플 슬래시 임포트는 호환성을 위해 남아 있을 뿐, ECMAScript의 import, export를 사용하자.
앵귤러를 쓰는 게 아니라면 데코레이터를 호환성 문제가 있으니 쓰지 말자.
// 데코레이터 예시
class Greeter {
greeting: string; constructor(message: string) {
this.greeting = message;
}
@logged
greet() {
return "Hello, " + this.greeting;
}
}
function logged(target: any, name: string, descriptor: PropertyDescriptor) {
const fn = target[name];
descriptor.value = function() {
console.log(`Calling ${name}`);
return fn.apply(this, arguments);
};
}
console.log(new Greeter('Dave').greet()); // Logs:
// Calling greet
// Hello, Dave
const obj = {
one: "uno",
two: "dos",
three: "tres",
};
for (const k in obj) {
const v = obj[k]; // ❌ obj에 인덱스 시그니처가 없기 때문에 엘리먼트는 암시적으로 'any' 타입입니다.
}
let k: keyof typeof obj; // 이렇게 k 값을 정의하는 것도 하나의 방법임.
interface ABC {
a: string;
b: string;
c: number;
}
function foo(abc: ABC) {
for (const [k, v] of Object.entries(abc)) {
k; // type : string
v; // type : any
}
}
dom 계층 구조
eventTarget 형식에 classList 속성이 없습니다
등의 오류를 볼 수 있음.Event
타입은 가장 추상화된 이벤트임. Event에 clientY 속성이 없습니다
등의 에러를 본다면 더 구체적인 타입을 지정할 필요가 있음.class PasswordChecker {
#passwordHash: number;
constructor(passwordHash: number) {
this.#passwordHash = passwordHash;
}
checkPassword(password: string) {
return hash(password) === this.#passwordHash;
}
}
const checker = new PasswordChecker(hash('s3cret'));
checker.checkPassword('secret'); // Returns false
checker.checkPassword('s3cret'); // Returns true