October 02, 2020
κ°κ³Ό μ΄ κ°μΌλ‘ ν μ μλ μΌμ μ§ν©
νμ μ νμ κ²μ¬κΈ°(typechecker)λ₯Ό ν΅ν΄ μ ν¨νμ§ μμ λμμ΄ μ€νλλ μΌμ μλ°©νλ€.
νμ νμΈμλ νΉμ λμμ΄ μ ν¨νμ§ μλμ§ νλ¨ν μ μλ€.
μΆμ²: https://www.oreilly.com/library/view/programming-typescript/9781492037644/ch03.html TypeScript νμ κ³μΈ΅
function squareOf(n) {
return n * n
}
squareOf(2) //4λ‘ νκ°
squareOf('z') //NaNλ‘ νκ°
squareOf
ν¨μλ μ«μλ₯Ό νλΌλ―Έν°λ‘ λ°μΌλ©°, *
ν€μλλ₯Ό ν΅ν΄ κ³±μ
μ μ«μλ₯Ό λ°ννλκ±Έ
μ½λμμΌλ‘ μμΈ‘ ν μ μλ€. νμ§λ§ λ§€κ°λ³μμ λ¬Έμμ΄ νμ μ μ λ¬νλ©΄ μλμ λ€λ₯Έ κ²°κ³Όλ₯Ό λ°ννλ€.
function squareOf(n: number) {
return n * n
}
squareOf(2) //4λ‘ νκ°
squareOf('z') //μλ¬ TS2345: 'z' λΌλ νμ
μ μΈμλ 'number' νμ
μ λ§€κ°λ³μμ ν λΉν μ μμ
TypeScriptμμλ μ«μκ° μλ λ€λ₯Έ νμ μ μΈμλ‘ μ λ¬νλ©΄ μλ¬λ₯Ό λ°μ μν¨λ€.
TypeScriptμμλ νμ μ΄λ Έν μ΄μ μ ν΅ν΄ νμ μ μ νμ λ μ μκ³ , νΈμΆ λ° ν λΉμ μ ν ν μ μλ€.
βTypeScriptλ νΉμ νμ μ΄ μμΌ ν λ μ΄λ₯Ό λͺ μν μ μλ μΈμ΄β λΌκ³ μ΄ν΄ν μ μλ€.β
νμ μ μ’ λ₯μ νμ λ³μΉ, μ λμ¨(ν©μ§ν©) νμ , μΈν°μΉμ (κ΅μ§ν©) νμ λ±μ μμλ³Έλ€.
μ°Έ(true
) / κ±°μ§(false
) κ°μ λνλΈλ€.
let isBool: boolean;
let isLoading: boolean = false;
λͺ¨λ λΆλμμμ κ°μ λνλ΄κ³ ,
ECMAScript 2015μ μκ°λ 2μ§μ, 8μ§μ 리ν°λ΄λ μ§μνλ€.
let num: number;
let integer: number = 1;
let float: number = 3.14;
let hex: number = 0xf00d; // 61453
let binary: number = 0b1010; // 10
let octal: number = 0o744; // 484
let infinity: number = Infinity;
let nan: number = NaN;
let a: 26.218 = 26.218;
let b: a = 21 //μλ¬ TS2322: '21'νμ
μ '26.218'μ ν λΉν μ μμ
let oneMillion = 1_000_000 // 1000000 κ³Ό κ°μ
let twoMillion: 2_000_000 = 2_000_000
λ¬Έμμ΄μ λνλ λλ€.
μμ λ°μ΄ν '
, ν°λ°μ΄ν "
κ³Ό ES6 ν
νλ¦Ώ λ¬Έμμ΄λ μ§μνλ€.
let str: string;
let car: string = 'bmw';
let bicycle: string = 'citi100';
let brandCar: string = `${car} is brand car`;
let transport: string = 'My transport is' + bicycle;
let a: 'john' = 'john';
let b: 'john' = 'bob'; //μλ¬ TS2322: 'bob' νμ
μ 'john' νμ
μ ν λΉ ν μ μμ
λ°°μ΄ νμ
μ λνλ΄λ νμ
λ€μ []
μ μ°κ±°λ, μ λ€λ¦ λ°°μ΄νμ
Array<elemType>
λ‘ μΈ μ μλ€.
let student: string[] = ['bob', 'john'];
//let student: Array<string> = ['bob', 'john'];
let unionTypeArr: (string | number)[] = ['a', 1 , 'b', 2, 3];
// interface type
interface Student {
name: string,
age: number
}
const students : Student[] = [
{name:'john', age:20},
{name:'bob', age:21}
]
// readonly type
let nums: readonly number[] = [1,2,3];
nums[0] = 0; // Error - TS2542: Index signature in type 'readonly number[]' only permits reading.
nums.push(4); // Error - TS2339: Property 'push' does not exist on type 'readonly number[]'.
νμ μΌλ‘ κ³ μ λ κΈΈμ΄λ₯Ό κ°μ§ λ°°μ΄μ νννλ€.
But, push
, splice
array prototype λ©μλλ λ§μ μ μλ€..μ΄ λ¬΄μ¨?!
let tuple: [boolean, number];
tuple = [true, 1];
tuple = [false, 1, 2]; // error
tuple = [1, false]; // error
let car: [number, string, boolean] = [300, 'bmw', true];
console.log(car[0]); // 300
console.log(car[1]); // 'bmw'
console.log(car[2]); // true
let car: [number, string, boolean][];
car = [[300, 'bmw', true], [100, 'hyundai', true], [200, 'kia', true]];
let student: [string, number];
student = ['bob', 20];
student.push('john');
console.log(student) // ['bob', 20, 'john']
student.push({name:'k', age: 21}); // Error - TS2345: Argument of type 'true' is not assignable to parameter of type 'string | number'
κ°μ ν λΉνμ§ μμΌλ©΄ 0 λΆν° μμνλ€.
μλ°©ν₯ λ§€νλ μ§μνλ€. (λ¨, const enum μλλλ§ κ°λ₯ν¨.)
enum Language {
English,
Spanish,
Russian
}
console.log(Language[0]) // English
console.log(Language.English) // 0
console.log(Language.Spanish) // 1
enum Language {
English = 10,
Spanish = 200 + 300,
Russian
}
console.log(Language[0]) // English
console.log(Language.English) // 10
console.log(Language.Russian) // 501
const enum Language {
English = 10,
Spanish = 200 + 300,
Russian
}
console.log(Language[0]) // error const enumμ λ¬Έμμ΄ λ¦¬ν°λ΄λ‘λ§ μ κ·Όν μ μμ
console.log(Language.English) // 10
console.log(Language.Russian) // 501
μ΄λ€ νμ μ κ°λ ν λΉ ν μ μλ€.
μ΅λν μ§μνλκ±Έ μΆμ².
μΈλΆ λΌμ΄λΈλ¬λ¦¬ μ¬μ©μ @types κ° μλ κ²½μ° μ¬μ©ν μ μλ€.
μ§μ§ λ§κ·Έλλ‘ λ€ ν λΉ ν μ μμ΄μ μμλ λμ΄κ°λ€.
μ΅μμ νμ
μΈ unknown
μ μ΄λ€ νμ
μ κ°λ ν λΉ ν μ μμ§λ§,
unknown
μ λ€λ₯Έ νμ
μλ ν λΉ ν μ μλ€.
let a: any = 'abc';
let u: unknown = 123;
let can: boolean = a; // μ±κ³΅ anyλ λ§λ₯.
let cant: number = u; // μ€ν¨ unknownμ anyλ₯Ό μ μΈν λ€λ₯Έ νμ
μ ν λΉν μ μλ€.
let can2: any = u; // μ±κ³΅
let can3: number = u as number; // νμ
λ¨μΈμμ κ°λ₯
let a: unknown = 55
let b = a === 123 // false => bλ boolean νμ
μ΄ λ¨.
typeof
μ°μ°μκ° object
λ‘ λ°ννλ νμ
.
tsconfig μμ string : true
μ΄λ©΄ null
μ objectκ° μλ (null μμ)
μ¬μ€ κ±°μ λͺ¨λ μμ νμ μ΄λΌ λΉμΆμ².
κ°μ²΄λΌλ©΄ μμ±λ€μ λν΄ μΈν°νμ΄μ€λ νμ μμ±μ μΆμ².
//λΉμΆ
let obj: object = {};
let arr: object = [];
let func: object = function () {};
let date: object = new Date();
//μΆμ²
interface IStudent {
name: string,
age: number
}
let student: { name: string, age: number } = {
name: 'bob',
age: 20
};
let student: IStudent = {
name: 'bob',
age: 20
};
number
λ 253κΉμ§ μ μλ₯Ό νννμ§λ§, bigint
λ λ ν° μλ νν κ°λ₯.
BigIntλ μ μ 리ν°λ΄μ λ€μ nμ λΆμ΄κ±°λ(10n) ν¨μ BigInt()λ₯Ό νΈμΆν΄ μμ±ν μ μλ€.
let a = 2134n //bigint
const b = 5785n //5785n
let e = 77.5n //μλ¬ μ μμ¬μΌλ
let f: bigint = 100n //bigint
null
, undefined
λ λͺ¨λ νμ
μ νμ νμ
μ΄λ€.
let a = string = null;
let b = string = undefined;
let obj = {a:1} = undefined;
let obj = {a:1} = null;
let v = void = null;
let v = void = undefined;
λ°ν ν κ°μ΄ μλ ν¨μμμ μ¬μ©νλ€.
function helloworld(name: string): void {
console.log(`hello world ${name}`);
}
const hi: void = helloworld('bob');
console.log(hi); // undefined
μ λ λ°μν μ μλ νμ .
μ λ λ°ννμ§ μλ νμ .
νμ
κ°λμ μν΄ μ무 νμ
λ μ»μ§ λͺ»νκ² μ’νμ§λ©΄ never
νμ
μ μ»κ²λ¨.
unknown
κ³Ό λ€λ₯΄κ² any
μ‘°μ°¨λ ν λΉ ν μ μλ νμ
. μ€μ§ λ³ΈμΈλ§ λ³ΈμΈμκ² ν λΉ κ°λ₯.
function errorFunc() {
return error("Something wrong!");
}
function errorFunc(message: string): never {
throw new Error(message);
}
νμ΄ν ν¨μ ν΅ν΄μ νμ μ§μ μ΄ κ°λ₯νλ€.
μΈμμ λ°ν κ°μ νμ μ μ§μ ν μ μλ€.
let func: (arg1: number, arg2: number) => number;
func = function (x:number, y:number): number {
return x + y;
};
let func: () => void;
func = function () {
console.log('Hi bob');
};
λ³μΉμ΄λ λ³μλ₯Ό μ μΈν΄μ κ° λμ λ³μλ‘ μΉνλ―μ΄ βνμ λ³μΉβ μΌλ‘ νμ μ κ°λ¦¬ν¬ μ μλ€.
TypeScriptλ λ³μΉμ μΆλ‘ νμ§ μμΌλ―λ‘ λ°λμ λ³μΉμ νμ μ λͺ μμ μΌλ‘ μ μν΄μΌ νλ€.
type Age = number
type Person = {
name: string
age: Age
}
let age: Age = 20
let driver: Person = {
name:'bob',
age: age
}
// Ageλ numberμ λ³μΉμ΄λ―λ‘ numberμλ ν λΉν μ μλ€.
let age = 20
let driver: Person = {
name:'bob',
age: age
}
Or 쑰건
μ΄λΌκ³ μκ°νλ©΄ λλ€.
2κ° μ΄μμ νμ
μ νμ©νλ κ²½μ°, |
ν€μλλ₯Ό ν΅ν΄ ꡬλΆνκ³ , ()
λ μ νμ¬ν.
let union: string | number;
let unionOptional: (string | number);
union = 'Union type';
union = 123;
union = false; // Error - TS2322: Type 'false' is not assignable to type 'string | number'.
μ λμ¨κ³Ό λ°λ. And 쑰건
μ΄λΌκ³ μκ°νλ©΄ λλ€.
2κ° μ΄μμ νμ
μ μ‘°ν©νλ κ²½μ°, &
ν€μλλ₯Ό ν΅ν΄ μ¬μ© κ°λ₯νλ€.
interface IStudent {
name: string,
age: number
}
interface IOff {
isOff: boolean
}
const who: IStudent & IOff = {
name: 'bob',
age: 20,
isOff: true
};
μλ§μ μμ±μ κ°μ§κ±°λ λ¨μΈν μ μλ μμμ μμ±μ΄ ν¬ν¨λλ ꡬ쑰μμ μ¬μ©κ°λ₯ν μΈλ±μ€ μκ·Έλμ².
μΈλ±μ±μ μ¬μ©ν μΈλ±μ(Indexer)μ μ΄λ¦κ³Ό νμ κ·Έλ¦¬κ³ μΈλ±μ± κ²°κ³Όμ λ°ν κ° νμ μμ μ§μ νλ€.
μΈλ±μμ νμ
μ string
κ³Ό number
λ§ μ§μ ν μ μλ€.
let a : {
b: number,
c?: string,
[key:number]: boolean | string | number[]
}
interface IAlphabet {
[alphabetIndex: number]: string
}
let alphatbet: IAlphabet = ['a', 'b', 'c']; // Indexable type
console.log(alphatbet[0]); // 'a' is string.
console.log(alphatbet[1]); // 'b' is string.
console.log(alphatbet['0']); // Error - TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.