-
Notifications
You must be signed in to change notification settings - Fork 9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[4장] 타입 설계 (아이템 28 ~ 아이템 37) #6
Comments
아이템 32interface Layer {
layout : FillLayout | LineLayout;
paint: FillPaint | LinePaint;
}
위 같이 설계하는 것보다 더 나은 설계방법은 무엇일까요?
그리고 왜 더 나을까요? 퀴즈 정답
interface FillLayer와 LineLayer를 만들고 type Layer에 유니온으로 묶어주는방식이 더 나은 설계방식이다. 해당 방식으로 Layer를 정의하면 잘못된 조합으로 섞이는 경우를 방지할 수 있어서 더 유리하다.
|
아이템 33string 타입은 생각보다 넓은 타입입니다. 퀴즈 정답
type color = 'black' | 'white';
위와 같이 구체적으로 string을 좁히면 다른 틀린 값들이 들어오는 실수를 방지할 수 있다. |
아이템 35API에 대해 타입 정의 시, 데이터를 보고 타입을 정의하는게 바람직할까요? 명세를 보고 타입을 정의하는게 바람직할까요? 선택하셨다면 그 이유에 대해 설명해주세요! 퀴즈 정답
데이터가 아닌 명세를 보고 타입을 만들어야 한다. 데이터를 보고 타입을 정의하면 눈앞에 있는 데이터만 고려하게 되므로 예기치 않은 곳에서 오류가 발생할 수 있다. 데이터에 드러나지 않는 예외적인 경우들도 고려해주자!
|
아이템30동료 개발자와 원활한 협업을 위해 타입 정보들은 모두 주석으로 남겨주는 것이 좋다.(O/X) 퀴즈 정답
X
주석으로된 타입 정보에 모순이 발생할 수 있고 충분히 타입 정보를 코드로 남길 수 있다. |
아이템 31다음 중 맞는 설명을 모두 고르시오.
퀴즈 정답
2,4 번
|
아이템 34string 타입으로만 남발하여 선언된 코드를 피하는 것이 좋다.(O/X) 퀴즈 정답
정답은 O
string 타입보다는 더 구체적인 타입을 사용하는 것이 좋다. ex) 1.
inteface Album {
artist: string;
title : string;
releaseDate : string;
recordingType: string;
}
2.
type RecordingType = 'studio'|'live';
interface Album {
artist: string;
title: string;
releaseDate: Date;
recording Type: RecordingType;
}
2번처럼 코드를 작성하면, 타입스크립트는 오류를 더 세밀하게 체크할 수 있다. |
아이템 30당신은 회사의 코드를 유지보수 해야 합니다. /** 매개변수로 받은 arr은 변경되지 않습니다. */
function concat(arr: string[]) {
//...
} 퀴즈 정답정답은 주석보단 readonly로 선언하여 타입스크립트가 규칙을 강제할 수 있도록 하면 됩니다. function concat(arr: readonly string[]) {
//...
} |
아이템 33당신은 회사의 코드를 유지보수 해야 합니다.
function calculate(subject: string, grade: string) {
//...
} 퀴즈 정답string을 제거하고 유니온 타입을 사용해 받을 수 있는 값을 지정해주는 것이 좋습니다.
정답은 아래와 같습니다. (* 더 좋은 방안이 있다면 알려주세요) type Subject = 'math' | 'english' | 'korean';
type Grade = 'A' | 'B' | 'C' | 'D' | 'E';
function calculate(subject: Subject, grade: Grade) {
//...
} |
아이템 37빈 칸 안에 들어갈 말은?
퀴즈 정답정답은 상표 입니다! type Meters = number & {_brand: 'meters'}; //_brand: 'meters'
type Seconds = number & {_brand: 'seconds'}; //_brand: 'seconds'
const meters = (m: number) => m as Meters;
const seconds = (s: number) => s as Seconds;
const oneKm = meters(1000);
const oneMin = seconds(60); |
아이템 28다음의 타입스크립트 코드의 문제점은? interface State {
loading: boolean
error?: Error
} 퀴즈 정답로딩상태이면서, error인 상태가 존재할 수 없지만 타입상으로 존재함 type State = RequestSuccess | RequestPending | RequestFailed
interface RequestSuccess {
loading: false
}
interface RequestPending {
loading: true
}
interface RequestFailed {
loading: false
error: Error
} |
아이템 30다음 코드의 아쉬운점은? function delay(time: number){
... // 일정시간의 딜레이를 줌
} 퀴즈 정답내부 구현을 들여다 보지 않고서는, time의 단위가 얼마인지 알 수없음 ```ts function delay(ms: number){ ... // 일정시간의 딜레이를 줌 } ``` 변수명을 타입과 함께 잡숴보세요. |
아이템 33 interface Album {
artist: string;
title: string;
releaseDate: Date;
recordingType: 'studio' | 'live'
}
function pluck<T>(records: T[], key: keyof T): T[keyof T][] {
return records.map(r => r[key]);
}
pluck(albums, 'releaseDate') // 여기서 추론되는 타입은? 퀴즈 정답(string | Date)[] keyof T의 타입이 "artist" | "title" | "releaseDate" | "recordingType" 으로 추론되기 때문이다. key의 타입이 'releaseDate'로 추론되도록 generic을 활용해보자. ```ts function pluck(records: T[], key: K): T[K][] { return records.map(r => r[key]); }
|
아이템 37'상표 기법' 에 대한 특징으로 옳지 않은 것은?
퀴즈 정답
4번은 옳지 않습니다.
추가 속성을 붙일 수 없는 |
아이템 33
type RecordingType = 'studio' | 'live';
interface Album {
artist: string;
title: string;
releaseDate: Date;
recordingType: RecordingType;
}
function pluck<T>(records: T[], key:string): any {
return records.map(r => r[key]);
} 퀴즈 정답type RecordingType = 'studio' | 'live';
interface Album {
artist: string;
title: string;
releaseDate: Date;
recordingType: RecordingType
}
function pluck<T, K extends keyof T>(records: T[], key: K) : T[K][] {
return records.map(r => r[key]);
} |
아이템 31하단의 코드를 타입에러가 나는 코드입니다. 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, min);
}
}
return [min, max]
} 퀴즈 정답(1) (2) function extent(nums: number[]) {
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])];
}
}
return result;
} |
아이템 28아래 코드와 같은 타입 디자인으로 가장 적절한 것은?
퀴즈 정답
정답은 2번!
|
아이템 29-30다음중 권장되는 type design 이 아닌 특성을 고르시오.
퀴즈 정답
정답은 4번!
Consider including units in variable names for clarity.
|
아이템 31What would be the bugs you could find in the below example?
퀴즈 정답
Answer:
1. If the min or max is zero, it may get overridden.
2. If the nums array is empty, the function will return [undefined, undefined].
|
아이템 28유효한 상태와 무효한 상태를 둘 다 표현하는 타입은 혼란을 초래하기 쉽고 오류들을 유발합니다. 다음 interface를 적절하게 고쳐주세요. interface State { pageText: string; isLoading: boolean; error?: string; } 퀴즈 정답```TS interface RequestPending { state:'Pending'; } interface RequestError { state: 'Error'; error: string; } interface RequestSuccess { state: 'ok'; pageText: string; } type RequestState = RequestPending | RequestError | RequestSuccess; ``` |
아이템 29매개변수와 반환 타입의 재사용을 위해서 기본 형태와 느슨한 형태를 도입하는 것이 좋다. (O/X) 퀴즈 정답
O 보통 매개변수 타입은 반환 타입에 비해 범위가 넓은 경향이 있다. 그러므로 느슨한 형태를 도입하는 것이 좋다.
|
아이템 31null 값과 관련된 문제점을 찾아낼 수 있기 때문에 반드시 필요한 tsconfig 속성은 무엇일까요? 퀴즈 정답
strictNullChecks
|
아이템 32이 코드를 인터페이스 유니온을 사용하여 개선해보세요
퀴즈 정답
```
type Animal = Dog | Cat | Rabbit
interface Dog { interface Cat { interface Rabbit { function logName(animal: Animal){
|
아이템 33구체적인 타입으로 변경하세요
퀴즈 정답
```
function pluck(records: T[], key: K): T[K][] {
return records.map(r => r[key]);
}
```
|
아이템 36name의 이름이 적절한 것을 고르세요
퀴즈 정답
정답은 1번!
|
아이템 30아래의 코드를 보고 주석을 제거하기 위해 좋은 방안은? /** nums를 변경하지 않습니다. */
function sort(num: number[]) {
//...
} 퀴즈 정답
매개변수 num에 readonly를 붙인다.
|
아이템 31아래의 코드의 리턴 타입이 any[]인 이유는? function extent(nums: number[]) {
let max, min;
for (const num of nums) {
if (!min) {
min = num;
max = num;
} else {
min = Math.min(min, num);
max = Math.max(max, num);
}
}
return [min, max];
} 퀴즈 정답
변수 num의 null check가 안 되었기 때문이다. null check를 하고나서 배열에 담아야 number[]타입을 리턴한다.
|
아이템 36아래의 타입에서 애매한 부분을 고쳐보시오. interface Person {
type: 'a' | 'b' | 'o' | 'ab';
size: 's' | 'm' | 'l' | 'xl'; // 상의 사이즈
name1: string; // 이름
name2: string; // 닉네임
} 퀴즈 정답
type은 bloodType으로, size는 shirtSize로, name1은 name으로, name2는 nickname으로 변경한다.
|
[4장 퀴즈]
타입 추론 타입 설계 (아이템 28 ~ 아이템 37)
아래 마크다운을 복사 붙여넣기해서 코멘트로 퀴즈를 달아주세요 :)
객관식, 주관식에 상관없이 편하게 만들어주세요!
부가 설명을 달고 싶다면, 해설을 정답과 함께 옵션으로 작성하시면 됩니다.☺️
예시
The text was updated successfully, but these errors were encountered: