https://nomadcoders.co/typescript-for-beginners/lectures
- superset of javascript
- 자바스크립트의 superset
- 자바스크립트처럼 생긴 프로그래밍 언어
- 컴파일 하면 자바스크립트로 컴파일
- javascript의 업그레이드버젼 느낌..
- javascript가 엄격한 규칙이 없어서 사용하기 편하지만 큰 프로젝트를 하게될때 이러한 점은 치명적인 단점이 됨.
npm i -g typescript
로 설치- tsconfig.json 파일 생성해서 옵션 설정 =>
tsc -init
으로 만드는게 편한것같다.
{
"compilerOption": {
"module": "commnjs",
"target": "ES2015",
"sourceMap": true
},
"include": ["index.ts"],
"exclude": ["node_modules"]
}
- .ts 파일 만들고 ( ex. index.ts)
- 커맨드창에
tsc
명령어 입력. ( typescript를 javascript로 컴파일하는 명령어 ) - 편의를 위해 package.json 에 스크립트 추가.
{
"name": "typescript-for-beginner",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"prestart": "tsc"
},
"author": "",
"license": "ISC"
}
- 컴파일 후 바로 실행 할 수 있도록....
이를 해결하기위해 tsc-watch 를 설치하고 package.json을 수정해서 start script를 변경해준다.
{
"name": "typescript-for-beginner",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "tsc-watch --onSuccess \" node dist/index.js\" "
},
"author": "",
"license": "ISC",
"dependencies": {
"tsc-watch": "^5.0.2"
},
"devDependencies": {
"typescript": "^4.6.3"
}
}
이 때 tsconfig.json ( tsc -init 기본세팅으로 하고 outDir만 변경해주었다.
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"outDir": "./dist",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
이렇게 하면 코드가 변경될때마다 dist폴더하위에 컴파일된 파일이 생기며 컴파일이 끝났을 때 node 명령어가 호출되어서 실행된다
- 매개변수의 자료형 지정 가능
const name = "Daehwan2",
age = 33,
gender = "male";
const sayHi = (name: string, age: number, gender: string): string => {
return `Hello ${name}, ${age}, ${gender}`;
};
console.log(sayHi(name, age, gender));
export {};
- interface 제공 ( 컴파일시 js로 컴파일되지않음.)
interface Human {
name: string;
age: number;
gender: string;
}
const person = {
name: "daehwan2",
age: 24,
gender: "male",
};
const sayHi = (person: Human): string => {
return `Hello ${person.name}, ${person.age}, ${person.gender}`;
};
console.log(sayHi(person));
export {};
- class 의 내부를 선언하고 사용해야 함. 접근지정자도 가능. static 함수도 가능
class Human {
public name: string;
public age: number;
public gender: string;
constructor(name: string, age: number, gender: string) {
this.name = name;
this.age = age;
this.gender = gender;
}
}
const human = new Human("daehwan2", 24, "male");
const sayHi = (human: Human): string => {
return `Hello ${human.name}, ${human.age}, ${human.gender}`;
};
console.log(sayHi(human));
export {};
- 전체적으로 봤을 때 c나 c++ 등 다른 언어와 같이 자료형을 제공한다.
- 매개변수에 타입을 지정할 수 있고 문법이 엄격해졌다.
- 자바스크립트에서 기본적으로 제공되는 오버로딩기능이 엄격해졌다.
BlockChain에 대해 간단하게 이해하고 코드를 보면 이해할 수 있다. #4
import * as CryptoJS from "crypto-js";
class Block {
static calculateBlockHash = (
index: number,
previousHash: string,
timestamp: number,
data: string
): string =>
CryptoJS.SHA256(index + previousHash + timestamp + data).toString();
static validateStructure = (aBlock: Block): boolean =>
typeof aBlock.index === "number" &&
typeof aBlock.hash === "string" &&
typeof aBlock.previousHash === "string" &&
typeof aBlock.timestamp === "number" &&
typeof aBlock.data === "string";
public index: number;
public hash: string;
public previousHash: string;
public data: string;
public timestamp: number;
constructor(
index: number,
hash: string,
previousHash: string,
data: string,
timestamp: number
) {
this.index = index;
this.hash = hash;
this.previousHash = previousHash;
this.data = data;
this.timestamp = timestamp;
}
}
const genesisBlock: Block = new Block(
0,
"202031210312313",
"",
"hello",
123456
);
let blockChain: [Block] = [genesisBlock]; //Block 객체만 받을수있는 배열
const getBlockchain = (): Block[] => blockChain;
const getLatestBlock = (): Block => getBlockchain()[blockChain.length - 1];
const getNewTimeStamp = (): number => Math.round(new Date().getTime() / 1000);
const createNewBlock = (data: string): Block => {
const previousBlock: Block = getLatestBlock();
const newIndex: number = previousBlock.index + 1;
const newTimestamp: number = getNewTimeStamp();
const newHash: string = Block.calculateBlockHash(
newIndex,
previousBlock.hash,
newTimestamp,
data
);
const newBlock: Block = new Block(
newIndex,
newHash,
previousBlock.hash,
data,
newTimestamp
);
addBlock(newBlock);
return newBlock;
};
const getHashforBlock = (aBlock: Block): string =>
Block.calculateBlockHash(
aBlock.index,
aBlock.previousHash,
aBlock.timestamp,
aBlock.data
);
const isBlockValid = (candidateBlock: Block, previousBlock: Block): boolean => {
if (!Block.validateStructure(candidateBlock)) {
return false;
} else if (previousBlock.index + 1 !== candidateBlock.index) {
return false;
} else if (previousBlock.hash !== candidateBlock.previousHash) {
return false;
} else if (getHashforBlock(candidateBlock) !== candidateBlock.hash) {
return false;
} else {
return true;
}
};
const addBlock = (candidateBlock: Block): void => {
if (isBlockValid(candidateBlock, getLatestBlock())) {
blockChain.push(candidateBlock);
}
};
createNewBlock("second block");
createNewBlock("third block");
createNewBlock("fourth block");
console.log(blockChain);
export {};