Archive

2021-06-03 TIL

|

2021-06-03 TIL


  • 오늘 한 것

    1. 짤해 프로젝트 상세, 편집페이지 완성, 찜하기, 다운로드기능, SNS공유 기능 - 이미지 다운로드의 COR 이슈를 피하기 위해서 정말 갖은 노력을 한 것 같다. 자세한 내용은 따로 블로그에 포스팅을 해놓았다. 이미지 다운로드 기능이 해결되니 나머지는 순탄(?)하진 않아도 그럭저럭 풀렸다. 카카오톡은 워낙 api가 사용하기 쉽게 되어있어서 문제없이 해결되었다. 편집 페이지에서 이미지 위에 글씨를 얹을 수 있어야하는데 canvas를 사용하지 않고 css를 inline style로 적어 react에서 동적으로 바뀔 수 있게 해주었다. 문제는 이 역시 다운로드가 되어야했다. 하는 수 없이 이미지를 cloudinary에 호스팅해서 다시 다운받는 식으로 해결해야했다. 그리고 로그인한 유저가 짤주머니에 짤을 추가하는 기능을 구현했는데 이름만 다르지 장바구니와 마찬가지였다. firebase의 사용법을 열심히 찾아서 db에 저장하고 빼오는 것까지 완성했다.
    2. 리액트 tutorial 프로젝트 - 오히려 이 프로젝트가 나에겐 힐링인듯.

  • 내일 할 것
    1. 짤해 프로젝트 - 짤주머니 삭제 기능, 버튼들 기능 전부 구현, 배포
    2. 리액트 tutorial 프로젝트



  • 끝으로

오늘 많은 기능을 구현할 수 있어서 뿌듯했다.

오늘의 한 줄 총평 : 내일 완성하려나?


Typescript Day 07 - 배열과 튜플

|

Typescript Day 07 - 배열과 튜플


배열

타입스크립트에서 배열의 타입은 타입[]이다

let stringArr: string[] = ['1','2','3'];
let numberArr: number[] = [1,2,3];

type IPerson = { name: string, age?: number };
let personArr: IPerson[] = [{name: 'jack'},{name:: 'jane', age: 32}];


문자열과 배열 간 변환

문자열 => 배열 변환 시 split의 사용법

const split = (str: string, delim: string = ''): string[] => str.split(delim);

console.log(split('hello')); // ['h','e','l','l','o']
console.log(split('h-e-l-l-o', '-')); // ['h','e','l','l','o']

배열 => 문자열 변환 시 join의 사용법

const join = (arr: string[], delim: string = ''): string => arr.join(delim);

console.log(join(['h','e','l','l','o'])); // hello
console.log(join(['h','e','l','l','o'], '-')); // h-e-l-l-o


제네릭 방식 타입

배열을 다룰 때에는 string[]처럼 타입이 고정된 배열보다는 타입의 변수인 제네릭 타입을 사용하는 것이 편리하다.

const arrLength = <T>(array: T[]): number => array.length;

let numArray: number[] = [1,2,3];
let strArray: string[] = ['1','2','3'];

console.log(arrLength(numArray)); // 3
console.log(arrLength(strArray)); // 3


튜플

튜플 타입으로 요소의 타입과 개수가 고정된 배열을 만들 수 있다.

let tuple:[string, number] = ['123', 123];
tuple = [123, '123']; // 오류

튜플 사용법 예시

type ResultType = [boolean, string];

const do = (): ResultType => {
    try {
        //...
    } catch(err) {
        return [false, err.message]
    }
}


참고 자료


Do it 타입스크립트 프로그래밍

Typescript-Handbook

Typescript Day 06 - this

|

Typescript Day 06 - this


this

인스턴스는 기본적으로 this 키워드를 사용할 수 있다. (arrow function 제외)

타입스크립트는 this의 잘못된 사용을 감지할 수 있다.

타입스크립트에서 this가 가리키는 것을 명시하려면 아래와 같이 사용한다

function 함수명(this: 타입) {
    //...
}
interface IPerson {
    name: string;
    init(this: IPerson): () => {};
}

let jack: IPerson = {
    name: 'jack',
    init: function(this: IPerson) {
        return () => {
            return this.name;
        }
    }
}
let getName = jack.init();
console.log(getName()); // jack


콜백에서의 this

콜백으로 함수가 전달될 때 this를 구분해주어야 할 때가 있다.

interface Element {
    addClickListener(onclick: (this: void, e: Event) => void): void;
}

class Handler {
    info: string;
    onClick(this: void, e: Event) {
        console.log('clicked');
    }
}

let handler = new Handler();
element.addClickListener(handler.onClick);


참고 자료


Do it 타입스크립트 프로그래밍

Typescript-Handbook

2021-06-02 TIL

|

2021-06-02 TIL


  • 오늘 한 것

    1. 짤해 프로젝트 상세페이지 작성, 카드 액션 추가 - 상세페이지 버튼들의 기능을 구현해야하는데 이미지 다운로드에서 벌써 막혔다. CORS 이슈 때문에 google search API에서 가져온 이미지 링크를 클라이언트에서 다운받을 수가 없었다. 서버리스로 개발중이라 프론트단에서 어떻게든 해결해야하는데 흠.. 내일 더 방법을 찾아봐야겠다.

    2. 타입스크립트 이론 정리 - 타입스크립트에서의 배열과 튜플에 대해 공부하고 정리했다.

    3. 리액트 tutorial 프로젝트 - 아직은 강의 초반이라 프로젝트가 쉬운것만 나온다. 이정도 쯤이야.


  • 내일 할 것
    1. 타입스크립트 이론 정리
    2. 짤해 프로젝트 - 상세, 편집페이지 완성, 찜하기, 다운로드기능, SNS공유 기능
    3. 리액트 tutorial 프로젝트



  • 끝으로

오늘 이미지 다운로드에서 막혀버린 탓에 많은 시간을 잡아먹었다.

내일은 일정에 맞춰서 최대한 많은 기능들을 구현해야겠다.

오늘의 한 줄 총평 : 조금 더 속도를 높이자


Typescript Day 05 - 함수

|

Typescript Day 05 - 함수


함수

매개변수와 반환값의 타입주석은 일반적으로 생략이 가능하지만 좋지 않다

function 함수명(매개변수1: 타입1, 매개변수2: 타입2): 반환타입 {
	//...    
}

const 함수명 = (매개변수1: 타입1, 매개변수2: 타입2): 반환타입 => {
    //...
}


void 타입

아무런 값을 반환하지 않는 함수는 반환 타입이 void이다.

void는 함수의 반환 타입으로만 사용하도록 하자.


함수 시그니처

변수의 타입처럼 함수의 타입을 시그니처라고 한다.

(타입1, 타입2...) => 반환타입

const print: (string, number) => void = function(name: string, age: number): void {
    //...
}

// 매개변수가 없을 시
const pring: () => void = function(): void {
    //...
}


Type Alias

함수 시그니처를 별칭으로 만들어서 사용할 수 있다

type print = (string, number) => void;
const a: print = function(name: string, age: number): void {};


undefined 주의사항

interface IName {
    name: string
}

function getName(o: IName) {
    return o.name;
}

let name = getName(undefined); // 오류

undefined는 최하위 타입이므로 매개변수에 undefined를 넣어도 오류가 발생하지 않지만, return o.name 구문에서 undefined.name이 되므로 런타임 시 타입 오류가 발생한다.

이를 고려하려면 예외처리를 해주어야한다.

interface IName {
    name: string
}

function getName(o: IName) {
    return o !== undefined ? o.name : 'unknown';
}

let name = getName(undefined); // unknown

// 선택 속성에 대한 예외 처리
interface IAge {
    age?: number
}

function getAge(o: IAge) {
    return o !== undefined && o.age ? o.age : 0;
}

let age1 = getAge(undefined); // 0
let age2 = getAge(null); // 0
let age3 = getAge({age: 30}); // 30


선택적 매개변수 (Optional Parameter)

function aa(arg1: string, arg2?: number): void {}

// 선택적 매개변수가 있는 함수의 타입
type OptionalFunc = (string, number?) => void;


콜백 함수

함수 표현식을 매개변수로 받을 수 있다. 매개변수 형태로 동작하는 함수를 콜백함수라고 한다.

const init = (callback: () => void): void => {
    console.log(1);
    callback();
    console.log(2);
}

init(() => console.log(3));

// 1
// 3
// 2


중첩 함수

함수는 변수에 담아 사용할 수 있으므로 또 다른 함수를 중첩할 수 있다.

const calc = (val: number, cb: (number) => void): void => {
    let add = (a, b) => a + b;
    let multi = (a, b) => a * b;
    
    let result = multi(add(1,2), val);
    cb(result);
}

calc(30, (result: number) => console.log(result)); // 90


객체 반환 시 주의

arrow function으로 객체 반환 시 return을 생략하고 다음과 같이 작성하면 오류가 발생한다.

type Person = {name: string, age: number}
const a = (name: string, age: number): Person => {name, age} // 오류, 복합 실핼문으로 해석 
const a = (name: string, age: number): Person => ({name, age})

객체 반환 시 중괄호를 괄호로 한번 더 감싸야한다.


매개변수 비구조화 할당

매개변수에도 비구조화 할당 적용이 된다.

type Person = { name: string, age: number };

const print = ({name, age}: Person): void => {
    console.log(name, age);
};


색인 key, value로 객체 만들기

key, value 값으로 객체를 만들 수 있다.

const makeObject = (key, value) => ({ [key]: value });

const person = makeObject('name', 'jack'); // { name: jack }

타입스크립트에서는 key, value 형태의 타입을 색인 기능 타입(Indexable Type)이라고 한다

type IndexableType = {
    [key: string]: string
}

const makeObj = (key: string, value: string): IndexableType => ({[key]: value});

const person = makeObj('name', 'jack'); // { name: jack }

참고 자료


Do it 타입스크립트 프로그래밍

Typescript-Handbook