let num1: number = 123;
let num2: number = -123;
let num3: number = 0.123;
let num4: number = -0.123;
let num5: number = Infinity;
let num6: number = -Infinity;
let num7: number = NaN;
console.log(num3.toFixed(3));
let str2: string = "hello";
let str3: string = `hello`;
let str4: string = `hello ${num1}`;
let bool1: boolean = true;
let bool2: boolean = false;
let null1: null = null;
let unde1: undefined = undefined;
// strictNullCheck 가 true면 아래 오류 , false면 오류 x
// let numA: number = null;
리터럴 -> 값
let numA: 10 = 10;
// numA = 12;
let strA: "hello" = "hello";
// strA = "df";
// let boolA : true = false;
let numArr: number[] = [1, 2, 3];
let strArr: string[] = ["hello", "im", "yehchic"];
let boolArr: Array<boolean> = [true, false, true];
let multiArr1: Array<number | string> = [1, "hello"];
let multiArr2: (number | string)[] = [1, "hello"];
// console.log(multiArr1);
let doubleArr: number[][] = [
[1, 2, 3],
[4, 5],
];
길이와 타입이 고정된 배열
let tup1: [number, number] = [1, 2];
// tup1 = [1, 2, 3];
// tup1 = ["hello", "hi"];
let tup2: [number, string, true] = [1, "hello", true];
const users: [string, number][] = [
["이정환", 1],
["이아무개", 2],
["김아무개", 3],
["신아무개", 4],
// [5, "최아무개"],
];
id 옆 '?'의 의미는 해당 프로퍼티가 있어도 없어도 된다 라는 뜻
---- (선택적 프로퍼티(optional properties)).
let user: {
id?: number;
name: string;
} = {
id: 1,
name: "신수정",
};
let dog: {
name: string,
color: string,
} = {
name: "구름이",
color: "white",
};
user.id;
user = {
name: "홍길동",
}
프로퍼티의 값을 변경하지 못하도록 하는 키워드
let config: {
readonly apiKey: string,
} = {
apiKey: "MY API KEY"
}
// config.apiKey = "hacked"; (오류)
타입을 변수처럼 정의해서 사용할 수 있는 타입 별칭
type User = {
id: number;
name: string;
nickname: string;
birth: string;
bio: string;
location: string;
};
동일한 스코프에 중복된 이름으로 별칭을 선언하면 오류 발생!!(중복 주의)
만약 fucntion이 있고 함수 내 type User가 있으면 func 함수 안에서는 안에 있는 User가 타입이 되고, 함수 밖에서는 밖에 있는 User가 타입이 된다.
function func() {
type User = {};
}
let user1: User = {
id: 1,
name: "신수정",
nickname: "yehchic",
birth: "1999.04.20",
bio: "안녕하세요",
location: "서울시",
};
let user2: User = {
id: 2,
name: "뤂둥이",
nickname: "yehchic",
birth: "1999.04.20",
bio: "안녕하세요",
location: "서울시",
};
key와 value의 타입을 기준으로 규칙을 이용해 객체의 타입을 정의하는 것
type CountryCodes = {
[key : string] : string;
};
let countryCodes: CountryCodes = {
Korea: 'ko',
UnitedState : 'us',
UnitedKingdom : 'uk',
};
반드시 작성할 프로퍼티가 있을 때는 아래의 Korea와 같이 직접 적어준다.
type CountryNumberCodes = {
[key : string] : number;
Korea: number;
};
let countryNumberCodes : CountryNumberCodes = {
Korea: 410,
UnitedState: 840,
UnitedKingdom: 826,
};
‼️ 인덱스 시그니처 사용 시 주의사항
규칙을 위반하지만 않으면 모든 객체를 허용하는 타입이다.
let countryNumberCodes: CountryNumberCodes = {
Korea: 410,
};
여러가지 값들에 각각 이름을 부여해 열거해두고 사용하는 타입
enum에 숫자를 직접 적지 않아도 자동으로 위에서부터 0, 1, 2 순으로 들어간다.
// 숫자형 enum
enum Role {
ADMIN = 0,
USER = 1,
GUEST= 2,
}
// 문자형 enum
enum Language {
korean = "ko",
english = "en",
}
const user1 = {
name: "신수정",
role: Role.ADMIN, // 0 <- 관리자
language: Language.korean,
}
const user2 = {
name: "이혜진",
role: Role.USER, // 1 <- 일반 유저
}
const user3 = {
name: "이슬아",
role: Role.GUEST, // 2 <- 게스트
}
console.log(user1, user2, user3);
특정 변수의 타입을 우리가 확실히 모를 때
let anyVar: any = 10;
// anyVar = "hello";
// anyVar = true;
// anyVar = {};
// anyVar = () => {};
// anyVar.toUpperCase();
// anyVar.toFixed();
let num : number = 10;
num = anyVar;
let unknownVar: unknown;
unknownVar = "";
unknownVar = 1;
unknownVar = () => {};
unknown과 any 타입의 차이
- unknown은 모든 값을 저장할 수 있지만 반대로는 안된다.
- num = anyVar; 는 가능하지만 num = unknownVar; 는 불가능
아래 코드일 경우에만 가능
if (typeof unknownVar === "number") {
num = unknownVar;
}
- void -> 공허 -> 아무것도 없다.
- void -> 아무것도 없음을 의미하는 타입
function func1(): string {
return "hello";
}
function func2(): void {
console.log("hello");
}
let a: void;
// a = 1;
// a = "hello";
// a = {};
a = undefined;
never -> 존재하지 않는 불가능한 타입
function func3(): never {
while (true) {
}
}
function func4(): never {
throw new Error();
}
// let a: never;
// a = 1;
// a = {};
// a = "";
// a = undefined;
// a = null;
// a = anyVar;