
number, string, boolean, object
unknown, any, null, undefinded, void, symbol, never, etc....
다양한 종류의 타입 가운데, 치트키의 역할
any는 모든 타입을 수용할 수 있음
슈퍼타입 : 상대적으로 상위랭크되어있는 타입 > 수용할 수 있는 타입의 개수 많아짐
서브타입 : 상대적으로 하위랭크되어 있는 타입 > 수용할 수 있는 타입의 개수 한정적
unknown (가장 최상위 타입, 슈퍼타입) <=> 서브타입
출처 : 이젠아카데미 선생님...
모든 값을 받아올 수 있지만 재할당이 불가
타입제한적용
let test01: any = 10;
test01 = "hi";
남발하면 안됨 (부득이한 경우에만 사용 추천)
함수, 변수에 반환할 값이 없는 경우 사용
const func1 = (): void => {
console.log("world");
};
let test05: void;
모든 타입중 최하위
const func3 = (): never => {
while (true) {}
};
값이 들어올 수 없는 상황일때 사용
대수타입 : 슈퍼타입 > 서브타입
모든 타입은 슈퍼타입 & 서브타입
타입 수용 => 타입 호환성
let num1: number = 10;
let num2: 10 = 10;
num1 = num2;
num2 = num1; // 에러
interface Book {
name: string;
price: number;
}
let book: Book; // 상대적 슈퍼타입
interface ProgrammingBook {
name: string;
price: number;
skill: string;
}
let programmingBook: ProgrammingBook = {
name: "TS",
price: 33000,
skill: "Typescript",
};
book = programmingBook
programmingBook = book // 다운캐스팅=> 에러
슈퍼타입이라도 바로 서브타입을 할당할 수 없음
따라서 슈퍼타입에 서브타입을 할당해야할 경우 => 초과 프로퍼티 검사
let book3: Book = programmingBook;
새로운 변수를 사용
const strArr: String[] = ["1", "2", "3"];
const boolArr: Array<boolean> = [true, false, true];
const multiArr: (string | number | boolean)[] = [1, "hello", true];
const doubleArr: number[][] = [
[1, 2, 3],
[4, 5, 6],
];
let tup1: [number, number] = [1, 2];
예외
tup1.push(3);
console.log(tup1); // [1,2,3] : push는 방지가 안됨
const users: [String, Number][] = [
["Divid", 1],
["Song", 2],
["ASK", 3],
];
const boolArr: Array<boolean> = [true, false];
<> 안에 값을 정의
점진적 타입시스템
const user: {
id: number;
name: string;
} = {
id: 1,
name: "David",
};
번거롭지만 가장 간단한 방법
const user: {
id?: number; //있어도 되고 없어도 됨
name: string;
} = {
name: "David",
};
선택적 값인 경우 키 뒤에 ? 를 추가하여 선택값임을 나타냄
let config: {
readonly apikey: string;
} = {
apikey: "32121515153",
};
config.apikey = "adfadf" // 불가, 에러
키 앞에 readonly 사용시 재할당 불가
하나의 타입 정의 후 동일한 형태에 배분
type User = {
id: number;
name: string;
location: string;
};
let user1: User = {
id: 1,
name: "David",
location: "Seoul",
};
let user2: User = {
id: 2,
name: "Chae",
location: "Busan",
};
유의사항 : 동일한 이름으로 선언 불가 but 지역에서는 가능
type User = {
id: number;
name: string;
location: string;
};
type User = {}; // 불가
const fnc = () => {
type User = {}; // 가능
};
타입별칭으로 어떤 타입을 정의 => 하위 요소의 모든 타입의 형태가 동일한 경우
type CountryCodes = {
[key: string]: string;
};
const countryCodes: CountryCodes = {
korea: "ko",
UnitedState: "us",
UnitedKingdom: "uk",
};
최우선의 방법 추천X
객체의 타입 : interface 타입 정의가 일반적
선택적 프로퍼티
interface User01 {
id: number;
}
생긴건 type 정의와 비슷하지만
implements, extends 등등 사용 가능 > 확장성이 높음
class Person01 {
name: string;
age: number;
}
const person3: Person01 = new Person01();
바로 타입으로 사용 가능하다.
class Person2 {
constructor(public name: string, public age?: number) {}
}
접근제어자 public을 통해 필드값을 생략해서 작성 가능
interface Person5 {
name: string;
age: number;
}
class Person6 implements Person5 {
constructor(public name: string, public age: number) {}
}
const person05 = new Person6("Julia", 30);
Person5 을 반드시 포함하는 Person6의 타입 선언
abstract class Person7 {
constructor(public name: string, public age: number) {}
}
class Person8 extends Person7 {
public location: string;
constructor(name: string, age: number, location: string) {
super(name, age);
this.location = location;
}
}
추상적인 클래스를 먼저 생성
Person7을 기본으로 extends 라는 확장적 개념 사용
class TestA {
static initialValue = 1;
}
const test01A = TestA.initialValue;
console.log(test01A);
enum Role {
ADMIN = 0,
USER = 1,
GUEST = 2,
}
const user1 = {
name: "David",
role: Role.ADMIN,
};
const user2 = {
name: "SSSS",
role: Role.USER,
};
const user3 = {
name: "AAA",
role: Role.GUEST,
};
id값과 role를 합친 enum Role을 선언해서 한번에 사용 가능
실수를 많이 줄여줌