Closed moonheekim0118 closed 1 year ago
class Person {
constructor(public name:string){}
}
그 외에도..
객체에 임의의 속성을 추가하는 것은 side-effect를 야기할 수 있기 때문에 좋지 않다. 또한 타입스크립트까지 더하면 타입 체커는 내장 속성에 대해서는 알고 있지만, 임의로 추한 속성에 대해서는 알지 못한다.
(document as any).monkey = 'Tamarin'
interface Document {
monkey: string;
}
document.monkey = 'Tamarin';
interface MonkeyDocument extends Document {
monkey: string;
}
(document as MonkeyDocument).monkey = 'Macaque'
사용자를 위한 문서라면 JSDoc 스타일의 주석을 만드는 것이 좋다. (/** */
사용하기) 인라인 주석은 편집기가 표시해주지 않는다.
TSDoc에서는 @param과 @returns 같은 규칙을 사용할 수 있다.
TSDoc은 마크다운 형식으로 꾸며진다.
주석에는 타입 정보를 포함하면 안된다
this는 정의된 방식이 아니라 호출된 방식에 따라 달라진다.
this 바인딩 과정을 이해하고, 콜백 함수에서 this 를 사용해야 한다면 타입을 명시해주어야 한다.
function addKeyListener{
el: HTMLElement,
fn: (this: HTMLElement, e: (KeyboardEvent)=>void )
}
function double(x: number|string): number | string;
const num = double(12) // string|number
const str = double('x') // string|number
위 선언문에는 number 타입을 매개변수로 넣고 string을 반환하는 경우와 string 타입을 매개변수로 넣고 number를 반환하는 경우가 포함되어 있다.
function double<T extends number|string>(x: T): T;
function double(x: any){ return x + x; }
const num = double(12) // 타입이 12
const str = double('x') // 타입이 'x', 'xx'도 아니고 'x'가 나온다
제너릭으로 모델링 할 수 있지만 너무 과하게 구체적이어진다.
function double(x: number): number;
function double(x: string): string;
function double(x: any) { return x + x; }
function f(x: string|number) {
return double(x); // 'string'|'number' 형식의 인수는 'string' 형식의 매개변수에 할당될 수 없습니다.
}
여러 가지 타입 선언으로 분리하기.타입 스크립트에서 함수의 구현체는 하나지만, 타입 선언은 몇 개든지 만들 수 있다.
하지만 유니온 타입 관련해서는 문제가 발생한다.
function double<T extends number|string> (
x: T
): T extends string ? string : number;
function double(x: any) { return x + x; }
function f(x: string|number) {
return double(x);
}
// (number|string) extends string ? string : number
// -> (number extends string ? string : number) | (string extends string ? string : number)
// number | string
조건부 타입 이용하기. 반환 타입이 더 정교하다.
마지막 4가지 정도는 정리하기 애매해서 키워드만 작성했습니다!
function extent(nums: number[]){
let min, max;
for (const num of nums) {
if(!min){
min = num;
max = num;
} else {
min = Math.min(min, num);
max = Math.max(max, num); -> max는 이곳에서 number | undefined 가 될 수 있다
}
}
return [min,max];
}
이런 경우에 대하여서는 null 값으로 처리하는 것이 더 편리하다
min, max를 한 객체에 넣고 null 이거나 아니거나를 확인한다 + null 아님 단언을 활용하면 min, max를 얻을 수 있다
let result : [number, number] | null = null;
for (const num of nums){
if(!result){
result = [num, num];
} else{
result = [Math.min(num, result[0]), Math.max(num, result[1]));
}
단순 if 문으로 null 인 경우에 대해서 처리해줄 수 있다
제어 흐름 파악을 위해서 태그를 활용하자
interface FillLayer {
type: 'fill';
layout: FillLayout;
}
interface LineLayer {
type: 'line';
layout: LineLayout;
}
interface PointLayer {
type:'paint';
layout: PointLayout;
}
관계가 있는 타입끼리는 하나로 묶자
interface Person{
name: string;
birth? :{ -> birth로 묶인 상태들을 동시 undefined일 경우가 있다
place: string;
date: Date;
}
}
인터페이스의 유니온을 사용하여 속성 사이의 관계를 모델링하기
interface Name{
name: string;
}
interface PersonWithBirth {
placeofBirth: string;
dateofBirth :Date;
}
type Person = Name: PersonWithBirth;
type RecordingType = 'studio' | 'live';
장점
function pluck(records: any[], key:string) : any [] {
->
type K = keyof Album;
function pluck<T>(records: T[], key: keyof T) {
객체의 속성 이름을 함수 매개변수로 받을 때는 string 보다 keyof T를 사용할 것
function pluck<T>(records: T[], key: keyof T): T[keyof T][]
const releasDates = pluck(albums, 'releaseData');
@types
추가하기npm은 자바스크립트 라이브러리 저장소(npm 레지스트리)와 프로젝트가 의존하고 있는 라이브러리들의 버전을 지정하는 방법(package.json)을 제공한다.
타입스크립트는 개발 도구일 뿐 타입 정보는 런타임에 존재하지 않으므로 타입스크립트와 관련된 라이브러리는 일반적으로 devDependencies에 속한다.
타입스크립트의 자체 의존성과 타입 의존성(@types
)을 고려한다.
라이브러리에 타입 선언이 포함되어 있지 않아도 DefinitelyTyped(타입스크립트 커뮤니티에서 유지보수하고 있는 자바스크립트 라이브러리의 타입을 정의한 모음)에서 타입 정보를 얻을 수 있다. DefinitelyTyped의 타입 정의는 @types
스코프에 공개되며 타입 정보만 포함하고 구현체는 포함하지 않는다.
원본 라이브러리는 dependencies에 있더라도 @types
의존성은 devDependencies에 있어야 한다.
@types
)의 버전@types
역시 업데이트해야 한다.@param
과 @returns
같은 일반적 규칙을 사용할 수 있다. 타입스크립트 언어 서비스가 JSDoc 스타일을 지원하기 때문에, 타입스크립트 관점에서는 TSDoc이라고 부르기도 한다.오버로팅 타입보다 조건부 타입을 사용하는 것이 좋다. 오버로딩 타입이 작성하기는 쉽지만, 조건부 타입은 개별 타입의 유니온으로 일반화하기 때문에 타입이 더 정확해진다. 오버로딩 타입을 작성 중이라면 조건부 타입으로 개선할 수 있을지 검토해 본다.
작성 중인 라이브러리가 의존하는 라이브러리의 구현과 무관하게 타입에만 의존한다면, 필요한 선언부만 추출하여 작성 중인 라이브러리에 넣는 방식인 미러링(mirroring)을 고려해 보는 것도 좋다.
https://www.youtube.com/watch?v=XrnQgWzsRVQ
고지가 얼마 안남았읍니다 여러분 화이팅