내 코드 - 배열 원본 유지하기 위해 slice 메서드 사용 type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue }; type Obj = Record | Array; function chunk(arr: Obj[], size: number): Obj[][] { let result = []; if (arr.length >= 1) { for (let i = 0; i < arr.length; i += size) { result.push(arr.slice(i, i + size)) } } return result }; 다른 코드 참고한 코드 - 원본 배열을 바꾸는 splice 메서드 사용 type JS..
내 코드 class ArrayWrapper { private nums: number[]; constructor(nums: number[]) { this.nums = nums; } valueOf(): number { return this.nums.reduce((acc, cur) => acc + cur, 0) } toString(): string { return `[${this.nums}]` } }; 다른 코드 참고해서 변경한 코드 - 프로퍼티 앞에 private 키워드 대신 타입스크립트 # 사용 - 탬플릿 리터럴 대신 JSON.Stringify() 메서드 사용해서 배열 객체를 문자열로 변환 class ArrayWrapper { #nums: number[]; constructor(nums: number[])..
- array filter 메서드 사용하지 않고 filter 함수 구현 - 인자로 전달받은 fn의 리턴값이 true이면, filteredArr 배열에 추가하도록 처리 type Fn = (n: number, i: number) => any function filter(arr: number[], fn: Fn): number[] { let filteredArr = []; for (let i = 0; i < arr.length; i++) { if (fn(arr[i], i)) filteredArr.push(arr[i]) } return filteredArr; };
- setTimeout 함수 실행시 t라는 시간이 지난 후 fn 함수 실행되도록 스케줄링 한다. setTimeout이 리턴하는 timeoutId를 변수에 담고, timeout 취소하는 clearTimeout 함수를 리턴한다. type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue }; type Fn = (...args: JSONValue[]) => void function cancellable(fn: Fn, args: JSONValue[], t: number): Function { const timeoutId = setTimeout(() => { fn(...args) }, t) return ()..
구조적 타이핑을 보여주는 코드 정의된 코드 타입을 충족한다면 타입스크립트는 동일 타입으로 간주한다. DogInfo와 mallangInfo 타입이 완전 똑같지 않지만 타입스크립트는 정의된 코드를 충족시킨다고 보고 오류 발생시키지 않는다. interface DogInfo { name: string; age: number; } const mallangInfo = { name: "mallang", age: 5, weight: "3kg", likes: ["chicken", "snack"], }; const getMallangAge = (info: DogInfo) => { return info.age; }; getMallangAge(mallangInfo); 구조적 타이핑으로 인한 구조적 타입과 유니언 타입의 차이 ..