[Typescript] Type System

찐새·2022년 7월 22일
0

typescript

목록 보기
2/8
post-thumbnail

2. Typescript

  • Typescript는 강결합 언어로, 작성 후 Javascript로 변환해 줌.
  • 작성하는 동안 여러 에러를 잡아줌.
[1, 2, 3, 4] + false;
// Operator '+' cannot be applied to types 'number[]' and 'boolean'.

function divide(a, b) {
  // Parameter 'a' implicitly has an 'any' type.
  // Parameter 'b' implicitly has an 'any' type.
  return a / b;
}
divide(2, 3);
divide("x"); // Expected 2 arguments, but got 1.
  • 보호 장치가 생기는 이유는 타입 추론 덕분

2-2. Type System

  • 변수 타입을 명시적으로 선언해도 되고, Typescript가 자동으로 추론하기도 함.
// 타입 추론
let a = "Hello"; // let a: string

a = 1; // Type 'number' is not assignable to type 'string'.

// 명시적 선언
let b: boolean = "x"; // Type 'string' is not assignable to type 'boolean'.
  • 가급적 타입 추론을 유도하고, 꼭 명시해야만 하는 경우에 타입 선언하는 편이 효율적임.

2-2-1. Sort of Type

  • Object 내 type을 선언할 때는 변수에 {}를 추가하고 내부에 명시해준다.
const player: {
  name: string;
  age: number;
} = {
  name: "js",
};
  • undefined일 수도 있는 경우, 옵셔널을 추가한다.
const player: {
  name: string;
  age?: number;
} = {
  name: "js",
};
  • 여러 Object가 같은 타입을 반복한다면 상단에 type을 선언한다.
type Player = {
  name: string;
  age?: number;
};

const playerJs: Player = {
  name: "Js",
};

const playerSo: Player = {
  name: "So",
};
  • 함수에서 return 값의 type은 소괄호()와 중괄호{} 사이에 선언한다.
type Player = {
  name: string;
  age?: number;
};

function playerMaker(name: string): Player {
  return {
    name,
  };
}

const js = playerMaker("Js");
js.age = 12;
  • 화살표 함수에서는 다음과 같이 사용한다.
const playerMaker = (name: string): Player => ({ name });
  • 프로퍼티를 읽기 전용으로 만들 수도 있다.
  • readonly를 적용한 프로퍼티는 수정할 수 없다.
type Player = {
  readonly name: string;
  age?: number;
};

const playerMaker = (name: string): Player => ({ name });

const js = playerMaker("js");

js.name = "ts"; // Cannot assign to 'name' because it is a read-only property.
js.age = 12;
  • 배열 요소에 각각 type를 명시할 수 있다.(Tuple)
const player: [string, number, boolean] = ["js", 12, false];
  • typescript에서 벗어날 때 타입을 설정하고 싶다면 any로 명시한다.
  • 단, typescript의 보호 역시 사라지므로 감수해야 한다.
const a: any[] = [1, 2, 3, 4];
const b: any = true;

a + b; // No error
  • 변수 타입을 미리 알지 못할 때 unknown 타입을 지정한다.
let a: unknown;

if (typeof a === "number") {
  let b = a + 1;
}

if (typeof a === "string") {
  let b = a.toUpperCase();
}
  • 아무것도 return하지 않는 함수에는 void 타입을 지정한다.
function hello() {
  // function hello(): void
  console.log("x");
}
  • 함수가 절대 return하지 않아야 할 때 never를 지정한다.
  • 예외 처리할 때 사용한다.
function hello(): never {
  return console.log("x"); // Type 'void' is not assignable to type 'never'.
}

function hello(): never {
  throw new Error("XXX");
}

function hello(name: string | number) {
  if (typeof name === "string") {
    name; // (parameter) name: string
  } else if (typeof name === "number") {
    name; // (parameter) name: number
  } else {
    name; // (parameter) name: never
  }
}
  • 위 코드에서 name"stirng" 이거나 "number"여야만 하므로 마지막 else는 절대 실행되어서는 안 되기 때문에 never로 타입 추돈되었다.

참고
Nomad Coders - Typescript로 블록체인 만들기

profile
프론트엔드 개발자가 되고 싶다

0개의 댓글