/* ts의 문자열, 숫자, 배열 기본타입*/
// js 문자열 선언
var str = 'hello';
// ts 문자열 선언
let str2: string = 'hello';
const num: number = 2;
// ts 배열 선언
let arr: Array<number> = [1,2,3]; // arr에는 배열(A는 대문자여야함), 그 안에는 숫자만 들어갈 수 있다.
let arr2:Array<string> = ["a",2]; // 이러면 에러다
// 배열 리터럴 사용해서 선언
let items: number[] = [1,2,3];
// ts 튜플(tuple)
let address: [string,number] = ['gangnam', 12] // 요런식으로 배열의 규칙까지 정해주는것, 요소의 타입과 개수가 고정된 배열을 표현할 수 있음
// ts 객체
let obj: object = {};
let person:object = {
name: 'gyoengmi',
age:100
} // 위에서 지정한대로만하면 어떤 속성이든지 상관 x , 객체이기만 하면된다
// 하지만
let person2:{name: string, age: number} = {
name:"gyoengmi",
age:100
} // 이런식으로 타입을 지정해두면 무조건 속성이 있어야만 오류를 안낸다!
// 진위값
let show:boolean = true;
let mathmatician = Math.random() > 0.5 ? undefined : "a";
// 값이 어떤것이냐에 따라 달라질수 있다
'이거 혹은 저거' 같은 타입 => 유니언
이라고 한다.
|
를 사용해 유니언 타입을 나타낸다.=> 변수 초깃값이 존재하더라도 명시적(분명한) 타입 애너테이션
제공하는것이 필요할때!
유니언 타입의 순서는 중요하지 않다.
모든 타입에 존재하는 속성
에만 접근가능.let physicist = Math.random() > 0.5 ? "Marie Curie" : 84;
physicist.toString(); // OK, number와 string 모두 사용가능
physicist.toUpperCase();
// Error: Property 'toUpperCase' does not exist on type 'string | number'
=> 근데 만약 내가 유니언 타입으로 정의된 타입들 중 하나의 속성만 사용하고 싶다면! => 내로잉
과정을 사용해야함
let admiral: number | string = "grace";
// 📌admiral이 string이므로 narrowing 한것
admiral.toUpperCase(); // OK: String
admiral = 23;
// 📌admiral이 number이므로 narrowing 한것
admiral.toFixed(); // OK
let scientist = Math.random() > 0.5
? "Frank"
: 51;
if(scientist === "Frank") {
scientist.toupperCase(); // OK
}
scientist.toupperCase(); // 📌Error 유니언타입 두가지 다 만족해야함
typeof
연산자 사용하여 타입 좁히기 = 실용적 방법!let something = Math.random() > 0.5 ? "leekoby" : 1;
// type이 number 일 때로 타입 좁히기
if (typeof something === 'number') {
something.toFixed();
}
// type이 string 일 때로 타입 좁히기
if (typeof something === 'string') {
something.toUpperCase();
}
// ! 를 사용한 논리 부정과 else 문도 가능
// type이 number 일 때로 타입 좁히기
if (!(typeof something === 'number')) {
something.toUpperCase();
} else something.toFixed();
// type이 string 일 때로 타입 좁히기
// 삼항연산자도 사용가능
typeof something === "string" ? something.toUpperCase():something.toFixed()
// ❌ Error : Property 'toUpperCase' does not exist on type 'number'.
something.toUpperCase();
특정 원싯값
으로 알려진 타입!)let name = "mia"; // 📌이 변수의 타입은 string이 아닌 "mia" 다
boolean: true | false
number: 0 | 1 | 2 | 3 | 0.1 | 0.2 | …
string : “” | “a” | “b” | “ab” | “adkdfo” | …
let name: "mia" = "mia"; // type이 "mia", 할당한값도 "mia"
something = "you"; // 📌 Error: Type '"you"' is not assignable to type '"mia"'.
null값
을 허용한다!// ❌ strictNullChecks
let name: string;
console.log(name.length); // No error, but runtime error
// ⭕ With strictNullChecks
let name: string | null;
console.log(name.length); // Error: Object is possibly 'null'.
falsy
로 정의된 값을 제외한 모든 값은 참이다let okk = Math.random() > 0.5
? "mia"
: undefined; //undefined는 falsy값
if(okk){
sth.toUpperCase(); //✅
}
okk.toUpperCase();
// ❌ Error : okk' is possibly 'undefined'.
=>
&&
와?
또한 가능하지만 이의 단점으로는
1. 참 여부 확인 회의 다른 기능 제공하지 않음
2. falsy값이 ""라면 빈문자열인지, undefined인지 알수 없음
undefined
가 된다let sth: string;
sth.length;
// ❌ Error : Variable 'sth' is used before being assigned.
let someth: string | undefined;
// 변수 타입에 undefined가 포함되어있는 경우에는 오류 보고 안됨
someth?.length; //✅
someth = "leekoby";
someth.length; // ✅
type 새로운이름 = 타입
=> pascalCase로 작성
type sth = string | name;
let something: sth = "mia";
type sth2 = boolean | number | string | null | undefined;
let first: sth2;
let second: sth2;
let third: sth2;
// ⭕ 훨씬 간단한 형태!
console.log(sth2);
//❌ Error : 'sth' only refers to a type,
but is being used as a value here.
=> 타입별칭은 자바스크립트엔 없다!
=> 컴파일되지 않는다!
type Id = number | string;
type Idmaybe = Id | undefined | null
// IdMaybe의 타입은 number | string | undefined | null