2024.10.27
추가하기
devDependencies
에 포함시키고 팀원 모두가 동일한 버전을 사용하도록 해야 합니다.@types
의존성은 dependencies
가 아니라 devDependencies
에 포함시켜야 합니다. 런타임에 @types
가 필요한 경우라면 별도의 작업이 필요할 수 있습니다.@types
의존성과 관련된 세 가지 버전이 있습니다. 라이브러리 버전, ®types
버전, 타입스크립트 버전입니다.@types
역시 업데이트해야 합니다.interface SecretName {
first: string;
last: string;
}
interface SecretSanta {
name: SecretName;
gift: string;
}
export function getGift(name: SecretName, gift: string): SecretSanta {
// ...
}
// 위의 공개 메서드에서 타입 추출하기
type MySanta = ReturnType<typeof getGift>; // SecretSanta
type MyName = Parameters<typeof getGift>[0]; // SecretName
JSDoc
/ TSDoc
형태를 사용 합시다. JSDoc
/ TSDoc
형태의 주석을 달면 편집기가 주석 정보를 표시해 줍니다.// JSDoc 활용
/**
* * 인사말을 생성합니다.
* @param name 인사할 사람의 이름
* @param title 그 사람의 칭호
* @returns 사람이 보기 좋은 형태의 인사말 */
function greetFullTSDoc(name: string, title: string) {
return 'Hello ${title} ${name}';
}
// TSDoc 활용
/** 특정 시간과 장소에서 수행된 측정 */
interface Measurement {
/** 어디에서 측정되었나? */
position: Vector3D;
/** 언제 측정되었나? epoch에서부터 초 단위로 */
time: number;
/** 측정된 운동량 */
momentum: Vector3D;
}
@param
, @returns
구문과 문서 서식을 위해 마크다운을 사용할 수 있습니다.function addKeyListener(el: HTMLElement, fn: (this: HTMLElement, e: KeyboardEvent) => void) {
el.addEventListener('keydown', (e) => {
fn.call(el, e);
});
}
// 라이브러리 사용자의 콜백 함수에서 this를 참조할 수 있고
// 완전한 타입 안전성도 얻을 수 있습니다.
declare let el: HTWLElement;
addKeyListener(el, function (e) {
this.innerHTWL; // 정상, "this"는 HTMLElement 타입
});
// 만약 라이브러리 사용자가 콜백을 화살표 함수로 작성하고 this를 참조할시 오류 발생
class Foo {
registerHandler(el: HTMLElement) {
addKeyListener(el, (e) => {
this.innerHIWL; // 'Foo' 유형에 'innerHIML' 속성이 없습니다.
});
}
}
// string 또는 number 타입의 매개변수가 들어올 수 있는 double 함수
// 오버로딩 타입 사용
function double(x: number): number;
function double(x: string): string;
function double(x: any) {
return x + x;
}
// 기대하는대로 정상 동작
const num = double(12); // 타입이 number
const str = double('x'); // 타입이 string
// 유니온 타입 관련해서는 문제 발생
function f(x: number | string) {
return double(x);
// ~ 'string | number' 형식의 인수는 'string1 형식의 매개변수에 할당될 수 없습니다.
}
// string 또는 number 타입의 매개변수가 들어올 수 있는 double 함수
// 제네릭과 조건부 타입 사용
function double<T extends number | string>(x: T): T extends string ? string : number;
function double(x: any) {
return x + x;
}
// 정상 동작
const num = double(12); // number
const str = double('x'); // string
// 정상 동작
function f(x: number | string) {
return double(x);
}
@types
의존성을 가지지 않게 해야 합니다. 그리고 웹 개발자가 NodeJS 관련된 의존성을 가지지 않게 해야 합니다.// Buffer 타입은 NodeJS 개발자만 필요함
// 따라서, 웹 개발자에게는 무관한 타입
function parseCSV(contents: string | Buffer): { [column: string]: string }[] {
if (typeof contents === 'object') {
// 버퍼인 경우
return parseCSV(contents.toString('utf8'));
}
// ...
}
// 타입을 미러링을 하여 일부 동작만 뗴어 내어 명시
interface CsvBuffer {
toString(encoding: string): string;
}
function parseCSV(contents: string | CsvBuffer): { [column: string]: string }[] {
// ...
}
this
가 API의 일부분이라면 역시 테스트해야 합니다dtslint
같은 도구를 사용하는 것이 좋습니다