React 책을 선택할 때, 일부로 타입스크립트를 사용하는 책을 선택해서 공부했다.
타입스크립트를 많이 사용한다고 하는데, 타입스크립트는 무엇인지 공부하기로 했다.
// javaScript
console.log(4 / [] ) ; => NaN 출력
let a = (4 ; => a는 4
//typeScript
console.log(4 / [] ) ; => 컴파일 에러
let a = (4 ; => 컴파일 에러
npm install -g typescript
**JSX 란?
JavaScript XML 의 약자로 JavaScript를 확장한 문법
- 자바스크립트에서 HTML 문법 사용 가능
- 리액트로 프로젝트를 개발할 때 사용되므로 공식적인 자바스크립트 문법은 아님
- 브라우저에서 실행하기 전에 바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환됨**
// 기본적인 타입 표기
let name: string;
let age: number;
const User {
name: "Henry",
id : 0
}
interface User {
name: string,
id: number
}
// interface 의 형태를 따르는 새로운 객체 생성
// 정의된 interface 에 맞지 않는 객체를 생성하면 경고
const user: User {
name: "Henry",
id: 0
}
// 인터페이스는 함수에서 매개변수와 리턴 값을 명시하는 데 사용 가능
function getAdminUser(): User {
}
function deleteUser(user: User) {
}
// 함수 스펙 지정
interface AddNumber {
(x: number, y: number): number; // return 해주는 값이 없으면 void
}
let addNumber: AddNumber = (x, y) => {
return x + y;
}
addNumber(10, 10); // result: 20
interface User {
readonly name: string;
}
let Users: ReadonlyArray<string> = ["철수", "영희"]; // 변경 불가
class UserAccount {
name: string;
id: number;
constructor(name: string, id: number) {
this.name = name;
this.id = id;
}
}
const user: User = new UserAccount("Murpy", 1);
let a = true; // a의 타입을 boolean 으로 판단
let b = 1; // b의 타입을 number로 판단
let c = 'hello'; // c의 타입을 string 으로 판단
let d = {}; // d의 타입을 object로 판단
// 타입스크립트 컴파일러가 타입을 유추할 수 있는 것에 중복하여 명시적으로 타입을 지정하는 것은 피해야 함
let name: string = '다은'
let a: string | number;
type MyBool = true | false;
type WindowStates = "open" | "closed" | "minimized"
type LockStates = "locked" | "unlocked"
interface Ujin {
name: string;
age: number;
}
interface Dabin {
name: string;
character: string;
}
function combine(person: Ujin | Dabin) {
person.name; // 정상
person.age; // Error
person.character; // Error
}
function combine(input1: number | string. input2: number | string) {
let reulst;
if (typeof input1 === 'number' && typeof input2 === 'number' ) {
result = input1 + input2;
} else {
result = input1.toString() + input2.toString();
}
return result;
}
const combine(user: Ujin | Dabin) {
if (user instanceof Ujin) {
user.jjeu_jjeu();
} else {
user.bong_gug();
}
}
type Centimeter = number;
type Kilogram = numbger;
type NumberArray = Array<number>;
type StringArray = Array<string>;
type Student = {
name: string;
height: Centimeter;
weight: Kilogram;
}
let student: Student = {
name: "daeun",
height: 153,
weight: 45
}
interface User {
name: string;
}
interface User {
age: number;
}
// User 에는 name, age 존재
type User {
name: string;
}
type User {
age: number;
} // Error
interface User {
name: string;
}
interface UserInfo extends User {
age: number;
}
let person: UserInfo = {
name: "철수",
age: 20,
}
interface User {
name: string
}
interface Age {
age: number;
}
// 인터페이스를 여러개 상속 가능
interface UserInfo extends User, Age {
gender: string;
}
// 인터페이스는 타입을 상속받을 수 있음
// 단 리터럴 타입과 유니온 연산자를 사용한 타입은 상속 불가
type User = {
name: string;
age: number;
}
interface UserInfo extends User {
}
type User = {
name: string;
}
type UserInfo = User & {
age: number;
};
let newUser: UserInfo = {
name: "영희",
age: 20
};
// 타입 -> 인터페이스 확장
interface User {
name: string;
}
type UserInfo = User & {
age: number;
}
interface Point {
x: number;
y: number;
}
function printPoint(p: Point) {
console.log(`${p.x}, ${p.y}`);
}
// point 변수는 Point 타입으로 선언된 적이 없지만, TypeScript는 타입 검사에서
// point의 형태와 Point 의 형태를 비교
// 같은 형태이기 때문에 통과
const point = { x: 12, y: 16 };
printPoint(point);
const point2 = { x: 12, y: 26, z: 89 };
printPoint(point3); // prints "12, 26"
class VirtualPoint {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
const newPoint = new VirtualPoint(13, 56);
printPoint(newPoint); // prints "13, 56"
let list: number[] = [1, 2, 3, 4, 5];
let member: (string | number | boolean | null)[] = ["김멋사", 10, true, null];
let str: Array<string | number> = ["김멋사", 10];
let str2: typeof str = ["김멋사", 20]; // 타입 쿼리
let arr: Array<() => string> = [() => "라이캣", () => "김멋사" ];
console.log(arr[0]()); // "라이캣" 출력
let member: [string, number] = ["김멋사", 10] ;
const student1: object= {};
const student2 = {}; // any 타입
const cat: {type: string, age?: number} = {
type: 'Persian'
};
cat.age=2;
enum Class {
Rock,
Scissors,
Pager
}
enum Class {
Rock = 0;
Scissors = 100 + 1; // 101
Pager // 102
}
enum Game {
Rock = "ROCK",
Scissors = "SCISSORS",
Pager = "PAPER"
}
enum Game {
Rock = "Rock",
Scissors = 2,
Paper
}
const enum Game {
Rock,
Scissors,
Paper
}