
2024.01.29(월)
자바스크립트 확장판 ⇒ 자바스크립트 + 타입체크

npm install -g typescripttsc filename.ts로 컴파일 (tsc는 typescript compiler의 약자)tsc --init → tsconfig.json 생성tsc -w filename.ts로 파일이 변경될 때마다 자동으로 compile 진행 (w는 watchdog의 약자)let age = 30;    // age의 변수 타입을 자동으로 number로 추론number, string, boolean, null, undefinedobject: 객체를 나타내는 타입array: 동일한 타입의 요소를 가진 배열을 나타내는 타입tuple: 각 요소가 다른 타입을 가질 수 있는 배열을 나타내는 타입any: 어떠한 타입이든 할당될 수 있는 타입unknown: 타입을 미리 알 수 없는 경우 사용되는 타입let age: number = 20;
age = '30'; // error TS2322: Type 'string' is not assignable to type 'number'.// 변수의 데이터 타입 명시
let age: number = 20;
let myName: string = "hwang";
let course: string = "typescript";
let completed: boolean = false;
// 함수의 데이터 타입 명시(매개변수, 반환형)
function plus(a: number, b: number): number {
    return a + b;
}
// 반환 값이 없을 때
function hello(): void {
    console.log("hello");
}
// 문자열 또는 문자열 array
function getLength(obj: string | string[]): number {
    return obj.length;
}
// 객체 구조 명시
function getInfo(id: number): {
    age: number;
    myName: string;
    course: string;
    completed: boolean;
} {
    // do something
    return null;
}? 붙이기extends가 아니라 implementsinterface Student {
    age: number;
    myName: string;
    gender: string;
    course: string;
    completed?: boolean;    // ?를 붙이면 optional property
}
function getInfo(id?: number): Student {
    return {
        age: 20,
        myName: "hwang",
		    gender = "male";
        course: "typescript",
        completed: false
    };
}
function setInfo(student: Student): void {
    console.log(student);
}interface Student {
    age: number;
    myName: string;
    gender: string;
    course: string;
    completed?: boolean;
    // 함수, 즉 method도 정의 가능
    // setName(name: string): void;
    setName: (name: string) => void;
    getName: () => string;
}
class MyStudent implements Student {
    age = 23;
    myName = "do0ori";
    gender = "female";
    course = "Full Stack";
		completed = false;
    // method overriding
    setName(name: string): void {
        this.myName = name;
        console.log(`이름 설정: ${this.myName}`);
    }
    getName(): string {
        console.log(`학생 이름: ${this.myName}`);
        return this.myName;
    }
}
const myInstance = new MyStudent();
myInstance.getName();   // 학생 이름: do0ori
myInstance.setName("JaeKyung"); // 이름 설정: JaeKyung
myInstance.getName();   // 학생 이름: JaeKyungenum GenderType {
    Male,   // default로 0부터 시작
    Female
}
interface Student {
    age: number;
    myName: string;
    gender: GenderType; // enum에서 정의한 타입 사용
    course: string,
    completed?: boolean;
    setName: (name: string) => void;
    getName: () => string;
}
class MyStudent implements Student {
    age = 23;
    myName = "do0ori";
    gender = GenderType.Female; // enum member 사용
    course = "Full Stack";
    // method overriding
    setName(name: string): void {
        this.myName = name;
        console.log(`이름 설정: ${this.myName}`);
    }
    getName(): string {
        console.log(`학생 이름: ${this.myName}`);
        return this.myName;
    }
}enum의 멤버 값 지정enum GenderType {
    Male = 2,   // 2
    Female      // 3
}enum GenderType {
    Male = "male",
    Female = "female"
}