π FrontEnd/TypeScript
TypeScript νμ μ€ν¬λ¦½νΈ κΈ°μ΄ -1
m-ur-phy
2022. 11. 8. 20:08
μμνλ©΄μ
νμ μ€ν¬λ¦½νΈμ κΈ°μ΄λ₯Ό 곡λΆν©λλ€.
TypeScript λ?
2012λ λ§μ΄ν¬λ‘μννΈκ° λ°νν νμ μ€ν¬λ¦½νΈ(TypeScript)λ μλ°μ€ν¬λ¦½νΈ(JavaScript)λ₯Ό κΈ°λ°μΌλ‘ μ μ νμ λ¬Έλ²μ μΆκ°ν νλ‘κ·Έλλ° μΈμ΄μ λλ€.
μ»΄νμΌ μΈμ΄, μ μ νμ μΈμ΄
- μλ°μ€ν¬λ¦½νΈλ λμ νμμ μΈν°νλ¦¬ν° μΈμ΄λ‘ λ°νμμμ μ€λ₯λ₯Ό λ°κ²¬ν μ μμ΅λλ€.
- μ΄μ λ°ν΄ νμ μ€ν¬λ¦½νΈλ μ μ νμ μ μ»΄νμΌ μΈμ΄μ΄λ©° νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬ λλ λ°λ²¨(Babel)μ ν΅ν΄ μλ°μ€ν¬λ¦½νΈ μ½λλ‘ λ³νλ©λλ€.
- μ½λ μμ± λ¨κ³μμ νμ μ 체ν¬ν΄ μ€λ₯λ₯Ό νμΈν μ μκ³ λ―Έλ¦¬ νμ μ κ²°μ νκΈ° λλ¬Έμ μ€ν μλκ° λ§€μ° λΉ λ₯΄λ€λ μ₯μ μ΄ μμ΅λλ€. νμ§λ§ μ½λ μμ± μ λ§€λ² νμ μ κ²°μ ν΄μΌ νκΈ° λλ¬Έμ λ²κ±°λ‘κ³ μ½λλμ΄ μ¦κ°νλ©° μ»΄νμΌ μκ°μ΄ μ€λ κ±Έλ¦°λ€λ λ¨μ μ΄ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈ μνΌμ (Superset)
- νμ μ€ν¬λ¦½νΈλ μλ°μ€ν¬λ¦½νΈμ μνΌμ , μ¦ μλ°μ€ν¬λ¦½νΈ κΈ°λ³Έ λ¬Έλ²μ νμ μ€ν¬λ¦½νΈμ λ¬Έλ²μ μΆκ°ν μΈμ΄μ λλ€.
- λ°λΌμ μ ν¨ν μλ°μ€ν¬λ¦½νΈλ‘ μμ±ν μ½λλ νμ₯μλ₯Ό .jsμμ .tsλ‘ λ³κ²½νκ³ νμ μ€ν¬λ¦½νΈλ‘ μ»΄νμΌν΄ λ³νν μ μμ΅λλ€.
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° μ§μ
- νμ μ€ν¬λ¦½νΈλ ES6(ECMAScript 6)μμ μλ‘κ² μ¬μ©λ λ¬Έλ²μ ν¬ν¨νκ³ μμΌλ©° ν΄λμ€, μΈν°νμ΄μ€, μμ, λͺ¨λ λ±κ³Ό κ°μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° ν¨ν΄μ μ 곡ν©λλ€.
Static Typing(μ μ νμ΄ν)?
- νμ μ λ§λ κ°λ§ ν λΉ/λ°ν λμ΄μΌνλ€λ λ»μ λλ€.
μμ μ ν¨κ» 곡λΆνλ TypeScript
ex1)
let num:number = 10;
console.log(num); // 10
let name1 = 'happy'; // ':νμ
' μ μλ΅νλ€λ©΄ μ΄κΈ°κ°μμ type μ΄ μ ν΄μ§λ€
// name1 = 10; // μλ¬νμ
console.log(name1); // 'happy'
function add(num1:number, num2:number){
console.log(num1+num2);
}
//add(); // μλ¬νμ
//add(1); // μλ¬νμ
add(1,2); // 3
//add(1,2,3); // μλ¬νμ
//add('hello', 'world'); // μλ¬νμ
ex1-1)
function showItems(arr:number[]){
arr.forEach((item) => {
console.log(item);
});
}
showItems([1,2,3]);
// showItems('νκΈΈλ'); // μλ¬νμ Argument of type 'string' is not assignable to parameter of type 'number[]'.
// let ary : string[] = ['aaa', 'bbb', 'ccc'];
// showItems(ary); // μλ¬νμ Argument of type 'string[]' is not assignable to parameter of type 'number[]'. Type 'string' is not assignable to type 'number'.
TypeScript κΈ°λ³Έ νμ μ§μ λ°©λ²
let car:string = 'BMW';
let age:number = 100;
let isAdult:boolean = true;
let num:number[] = [1,2,3,4,5,];
let num2:Array<number> = [100,200,300];
let str:string[] = ['μ¬κ³Ό','λ°°','μ°ΈμΈ','μλ°'];
let str2:Array<string> = ['λμ₯κ³ ','μ μκΈ°','μμ΄μ»¨','곡기μ²μ κΈ°'];
let obj:{name:string} = {name : 'kim'} ;
let obj2:{name:string, age:number, weight: number} = {name : 'kim', age: 50, weight: 100} ;
// let obj3:{a:string, b:number, c: number} = {name : 'kim', age: 50, weight: 100} ; // μμ± κ°μ μ΄λ¦μ λ§μΆ°μ£Όμ§ μλλ€λ©΄ λ°λ‘ μλ¬
let val:string | number = 'kim'; // λ¬Έμ λλ μ«μλ₯Ό λͺ¨λ λ°μ μ μλ€
val = 1000;
console.log(val);
// car = 100; // type μλ¬ λ°μ car:string
// age = 'νκΈΈλ'; // type μλ¬ λ°μ age:number
// num[0] = 'κΉμΉ'; // type μλ¬ λ°μ num:number[]
// str[0] = true; // type μλ¬ λ°μ str:string[]
// obj.name = 100; // type μλ¬ λ°μ obj:{name:string}
| (or)
function showItems(arr:number[] | string[]){
arr.forEach((item) => {
console.log(item);
});
}
showItems([1,2,3]);
showItems(['νλ¦°μ€μ‘', 'μ λ¨μ']);
any
let a:any = 100;
a = 'νκΈΈλ';
a = true;
νν(Tuple)
- μ§μ μνλ typeμ μ μΈν΄μ λμ λ§μΆ° μ§μ ν΄ μ€ μ μμ΅λλ€.
type Member = [number, boolean]; // νμ
λ§ μ§μ νλ€ (첫κΈμ λλ¬Έμ κΆμ₯)
type Aaa = number | string;
let c:Aaa;
c = 100;
c = 'νκΈΈλ';
let a:[string, number] = ['νκΈΈλ', 100];
a = ['k',1];
// a = [1,'k']; // μλ¬λ°μ -> μμκ° λ€λ₯΄λ€
let b:number[] = [1, 2, 3, 4, 5];
a[0].toUpperCase();
// a[1].toUpperCase(); // μλ¬λ°μ -> μ«μλ toUpperCaseλ₯Ό μ¬μ©ν μ μμ΄μ
let kim:Member = [123, true];
kim = [100, false];
// kim = ['νκΈΈλ', 100]; // μλ¬λ°μ -> μμκ° λ€λ₯΄κ΅¬λ
Void - ν¨μμμ 리ν΄κ°μ΄ μμ λ
- 리ν΄κ°μ μ€μ ν΄μ£Όλ μ΄μ λ? μ¬λ°λ₯Έ κ°μ μ»κΈ° μν΄μμ λλ€.
function sayHello():void{
console.log('hello');
// return 100;
}
function sayHello2():number{
return 100;
// return 'hello'; // μλ¬ λ°μ -> type μ΄ λ§μ§ μλ€
}
function sayHello3(a:number, b:number):number{
return a+b;
}
sayHello();
console.log(sayHello2());
console.log(sayHello3(100,200));
νμ΄ν ν¨μμμ 리ν΄κ°μ typeμ μ ν΄μ€ λ
const isGreater = (a: number, b: number): boolean => {
return a > b;
}
console.log(isGreater(100,200));
null , undefined
- μ΄λ€ κ°μ΄λ “λ°μ μ μλ€” λ₯Ό μλ―Έν©λλ€.
let a:null = null;
let b:undefined = undefined;
a=100; //μλ¬λ°μ
b=100; //μλ¬λ°μ
object (κ°μ²΄) 1
type Member = {
name : string,
tel : string,
add : string
}
let kim:Member = { name:'kim', tel:'010-0000-0000', add:'μμΈ'};
// μλ λ€μμ κ°λ€ let kim:{name: string, tel: string, add: 'μμΈ'} = { name:'kim', tel:'010-0000-0000', add:'μμΈ'};
console.log(kim.name, kim.tel, kim.add);
object (κ°μ²΄) 2
type Member = {
[key:string] : string // object μ νμ
μ§μ ν΄μΌ ν μμ±μ΄ λ무 λ§λ€λ©΄ μ΄λ κ² μ μ΄μ£Όλ©΄ λλ€
// key λΌλ μ΄λ¦μ μμλ‘ μ§μ ν κ²μ΄κΈ° λλ¬Έμ λ€λ₯Έ μ΄λ¦μ μ€ μ μλ€. (νμ§λ§ λ³΄ν΅ key value λκΉ λ)
}
let kim:Member = { name:'kim', tel:'010-0000-0000', add:'μμΈ' };
console.log(kim.name, kim.tel, kim.add);
μΈν°νμ΄μ€(interface)μ λ€μν νμ©
let user:object;
// let user:{name:string, age:number}; // λ§λλ μκ° κ°μ²΄μ νμ
, μμ±μ νμ
λ μ§μ μ ν΄μ£Όμ΄μΌ νλ€.
// type Member = { name:string, age:number }
// let user:Member{}
user ={
name : 'νκΈΈλ',
age : 30
}
console.log(user.name , user.age); // μλ¬ -> κ°μ²΄μ μμ±μ νμ
μ΄ μ§μ λμ§ μμμ
μΈν°νμ΄μ€ μ¬μ©
// type User = {
// name : string,
// age : number
// }
interface User { // type μ²λΌ νμ λ§λ€μ΄μ£Όλ μ©λμ΄λ€. κ°μ²΄λ κ°μ²΄ μ΄μμ μ©λλ‘ μ¬μ©ν λλ interfaceλ₯Ό μ¬μ©νλ€.
name : string;
age : number; // interface λ μΌνλ₯Ό μ¬μ©ν μ μμΌλ, μΌλ°μ μΌλ‘λ μΈλ―Έμ½λ‘ μ μ΄λ€.
}
let user : User = {
name : 'νκΈΈλ',
age : 30
}
user.age=10;
console.log(user.name , user.age);
?
- μ¬μ©ν΄λ λκ³ μν΄λ λλ μμ±μ ?μ΅μ μ μ¬μ©νλ€
interface User {
name : string;
age : number;
gender? : string;
}
let user : User ={
name : 'νκΈΈλ',
age : 30
}
user.age=10;
user.gender = 'male'; // μ΄κΈ°κ°μ μ£Όμ§ μμμ§λ§ gender? λ‘ μ²λ¦¬ν΄μ μλ¬ λ°μνμ§ μλλ€
console.log(user.name , user.age);
readonly (μ½κΈ° μ μ©)
- κ°μ μ½μ μλ μμ§λ§ μμ ν μλ μλ€ λ§μΉ const μ²λΌ…
interface User {
name : string;
age : number;
gender? : string;
readonly birthYear : number;
}
let user : User ={
name : 'νκΈΈλ',
age : 30,
birthYear : 2000
}
user.age=10;
user.gender = 'male';
// user.birthYear = 2022; //readonly μ΄κΈ°λλ¬Έμ μλ¬λ°μ
console.log(user.name , user.age, user.birthYear);
μ«μλ‘ μ μλ μμ±
interface User {
name : string;
age : number;
gender? : string;
readonly birthYear : number;
1 : string;
2 : string;
3 : string;
4 : string;
}
let user : User ={
name : 'νκΈΈλ',
age : 30,
birthYear : 2000,
1 : 'A',
2 : 'B',
3 : 'C',
4 : 'F'
}
user.age=10;
user.gender = 'male';
//user.birthYear = 2022; //readonly μ΄κΈ°λλ¬Έμ μλ¬λ°μ
console.log(user.name , user.age, user.birthYear, user.gender,
user[1], user[2], user[3], user[4]); // keyκ°μ΄ μ«μμΈ κ²½μ°μλ λκ΄νΈ μ°μ°μλ‘ μ κ·Όν΄μΌν¨
- μ΄λ κ²λ μ¬μ©ν μ μμ΅λλ€.
interface User {
name : string;
age : number;
gender? : string;
readonly birthYear : number;
[key:number] : string;
}
let user : User ={
name : 'νκΈΈλ',
age : 30,
birthYear : 2000,
1 : 'A',
2 : 'B',
3 : 'C',
4 : 'F'
}
user.age=10;
user.gender = 'male';
// user.birthYear = 2022; //readonly μ΄κΈ°λλ¬Έμ μλ¬λ°μ
console.log(user.name , user.age, user.birthYear, user.gender, user[1], user[2], user[3], user[4]);
μ¬λ¬κ°μ κ°μ²΄ μμ±μ νλ²μ μ μνλ λ°©λ²
type Score = 'A' | 'B' | 'C' | 'D' | 'F'; // 5κ°μ νμ (λλ¬Έμ)λ§ μ¬μ©
interface User {
name : string;
age : number;
gender? : string;
readonly birthYear : number;
[key:number] : Score;
// [key:number] : 'A' | 'B' | 'C' | 'D' | 'F'; // [key:number] : string;
}
let user : User ={
name : 'νκΈΈλ',
age : 30,
birthYear : 2000,
1 : 'A',
2 : 'B',
3 : 'C',
4 : 'F'
}
user.age=10;
user.gender = 'male';
// user.birthYear = 2022; // readonly μ΄κΈ°λλ¬Έμ μλ¬λ°μ
console.log(user.name , user.age, user.birthYear, user.gender, user[1], user[2], user[3], user[4]);
ν¨μ μ μ
interface Add {
(x1: number, y1: number) : number; // (λ§€κ°λ³μ) : 리ν΄κ° -> λ§€κ°λ³μ μ΄λ¦μ λ€λ₯Έμ΄λ¦μ μ¨λ μ무 μκ΄μ΄ μλ€.
}
const add : Add = function(x, y) {
return x + y;
}
// μ΅λͺ
ν¨μ λ²μ
// const add = function(x:number, y:number):number {
// return x + y;
// }
console.log(add(10, 20)); // 30
interface IsAdult{
(age:number): boolean;
}
const kim: IsAdult = (age) => {
return age>19;
}
console.log(kim(30)); // true