에러발생
해결
https://ksbgenius.github.io/nodejs/2020/12/13/npm-global-install-solution-permission-denied.html
npm init -y
npm i typescript -D
: 개발용으로 사용하는 모듈이다 -D
npx tsc --init
: 타입스크립트 기본설정으로 tsconfig.json
파일이 생성됨
타입 표기 (Type Annotation)
자바스크립트와 가장 차별되는 것
타입스크립트 코드에서 어떤 변수 또는 값의 타입을 표기하기 위해 타입 표기를 사용한다.
타입 표기는 식별자 또는 값 뒤에 콜론(:)을 붙여 value: type 의 형태로 표기한다.
TypeScript의 핵심 primitive types는 모두 소문자!!
let isDone: boolean = false;
typeof isDone === 'boolean' // true
// Type 'boolean' is assignable to type 'Boolean'.
let isOk: Boolean = true;
// Type 'Boolean' is not assignable to type 'boolean'.
// 'boolean' is a primitive, but 'Boolean' is a wrapper object.
// Prefer using 'boolean' when possible.
let isNotOk: boolean = new Boolean(true); //이렇게 하면 안됨!!!
let decimal: number = 6; // 10진수 리터럴
let hex: number = 0xf00d; // 16진수 리터럴
let binary: number = 0b1010; // 2진수 리터럴
let octal: number = 0o744; // 8진수 리터럴
let NotANumber: number = NaN;
let underscoreNum: number = 1_000_000;
string
형식을 사용한다.let name: string = "Sseul";
name = 'seulgi';
${ expr }
와 같은 형태로 사용let fullName: string = `Bob Bobbington`;
let age: number = 29;
let sentence: string = `Hello, my name is ${ fullName }.
I'll be ${ age + 1 } years old next month.`;
// template string 을 사용하지 않을 경우
let sentence: string = "Hello, my name is " + fullName + ".\n\n" +
"I'll be " + (age + 1) + " years old next month.";
console.log(Symbol('foo') === Symbol('foo'));
함수로 사용할 때에는 대문자 Symbol, 타입으로 사용할 때에는 소문자 symbol
// 이 변수들에 할당할 수 있는 것들은 거의 없다.
let u: undefined = undefined;
let n: null = null;
--strictNullChecks
사용하면, null 과 undefined 는 void 나 자기 자신들에게만 할당할 수 있다.let name: string = null;
let age: number = undefined;
// strictNullChecks => true
// Type 'null' is not assignable to type 'string'.
let name: string = null; (X)
// null => null || void, undefined => undefined || void
// Type 'null' is not assignable to type 'undefined'.
let u: undefined = null; // (X)
let v: void = undefined; // (O)
let union: string | null | undefined = 'str'; //union type
// create by object literal
const person1 = {name: 'Sseul', age: 29};
// person1 is not "object" type.
// person1 is "{name: string, age: number}" type.
// create by Object.create
const person2 = Object.create({name: 'Sseul', age: 29});
"primitive type 이 아닌 것" 을 나타내고 싶을 때 사용하는 타입
- non-primitive type
not number, string, boolean, bigint, symbol, null, or undefined.
let obj: object = {};
obj = {name: 'Mark'};
obj = [{name: 'Mark'}];
obj = 39; // Error
obj = 'Mark'; // Error
obj = true; // Error
obj = 100n; // Error
obj = Symbol(); // Error
obj = null; // Error
obj = undefined; // Error
let list:number[] = [1, 2, 3];
// 보통은 공통된 것 (number)로 묶어주는데
let list: number [] = [1, 2, 3, "4"]; //에러발생
//해결
let list: (number | string)[] = [1, 2, 3, "4"];
//let list: Array<number> = [1, 2, 3]; 잘 사용 안함! jsx에서 충돌 날 수있다하여..!
let x: [string, number];
x = ["hello", 39];
// x = [10, "sseul"];
x[0] = "world";
// x[1] = "world" //number로 안되어 에러 발생
const person: [string, number] = ["sseul", 29];
const [first, second] = person //구조분해할당
타입 안전성은 TypeScript 를 사용하는 주요 동기 중 하나이며 필요하지 않은 경우에는 any 를 사용하지 않도록 해야한다.
function leakingAny(obj: any) {
const a = obj.num; // const a: number = obj.num;
const b = a + 1;
return b;
}
const c = leakingAny({num: 0});
const d: string = c.indexOf('0'); //에러 발생 c.indexOf는 함수에 없으니까!!
declare const maybe: unknown;
const aNumber: number = maybe; //unknown은 number타입에 바로 할당 할 수 없음
if (maybe === true) {
const aBoolean: boolean = maybe;
// const aString: string = maybe; //maybe는 true이니까 string에 할당할 수 없는것!
}
if (typeof maybe === "string") {
const aString: string = maybe;
// const aBoolean: boolean = maybe;
}
// Function returning never must have unreachable end point
// 어떠한 형태도 리턴되지않는다.
function error(message: string): never {
throw new Error(message);
}
// Inferred return type is never
// error라는 함수를 사용하면서 리턴하는 경우에도 never라고 추론됨
function fail() {
return error("Something failed");
}
// Function returning never must have unreachable end point
// 무한반복이기에 조건이 항상 true이면 이 밑으로 내려가지 않으니까!
function infiniteLoop(): never {
while (true) {
}
}
let a: string = 'hello';
//a가 string인데, string이 아닌 경우이니까 never가 됨! 그렇기에 잘못된 실수를 막을 수 있음
if (typeof a !== 'string') {
let b: never = a;
}
function returnVoid(message): void {
console.log(message);
}
returnVoid('리턴이 없다');
let unusable: void = undefined;