홍열 2022. 2. 15. 10:33
728x90

Primitive Type

Object와 레퍼러스 형태가 아닌 실제 값을 저장하는 자료형

프리미티브 형의 내장함수를 사용가능하는 것은 자바스크립트 처리 방식 가능

ex) let name = 'mark'

name.toString()

 

종류

- boolean, number, string, symbol, null, undefined

 

literal 값으로 Primitive 타입의 서브 타입을 나타낼수 있다. 

true (Boolean의 subType)

'hello' (String의 subType)

3.14

null

undefined

 

또는 래퍼 객체로 만들 수 있다. 이건 오브젝트임 ..타입스크립트에서는 이렇게 쓰는것을 추천하지 않음

new Boolean(false); // typeof new Boolean(false) : 'object'

new String('world'); // typeof new String('world') : 'object'

new Number(42); // typeof new Number(42) : 'object'

 

 

boolean

let isDone:boolean = false;

isDone = true;

console.log(typeof isDone) //'boolean'

let isOK:Boolean = true;
//let isNotOk:boolean = new Boolean(true); //소문자는 primitive type, 대문자는 Object type이여서 에러나는 코드

 

number

let decimal:number = 6;

let hex:number = 0xf00d

let binary:number = 0b1010

let octal:number = 0o744

let notAnumber:number = NaN; //NaN이 숫자의 한 형태

let underscoreNum:number = 1_000_000

string

let myName:string = "Mark"

myName = 'Anna';

Template String

행에 걸쳐 있거나, 표현식을 넣을 수 있는 문자역

이 문자열은 backtick기호에 둘러쌓여 있음

포함된 표현식은 '${expr} 형태로 사용 

let fullName:string = "Mark Lee";
let age:number = 11;

let sentence:string = `Hello, My name is ${fullName}, age ${age}.`

console.log(sentence)

 

symbol

ES2015부터 지원가능

new Symbol 사용 불가능, 함수처럼 호출해서 사용가능

console.log(Symbol('foo') === Symbol('foo')); // false

프리미티브 타입의 값을 담아서 사용

고유하고 수정불가능한값으로 만들어준다. 

 

null & undefined

null은 null만, undefined는 undefined만 가질 수 있다. 

이 둘은 다른 모든 타입의 subType으로 존재한다. 

//같은 타입에만 사용 가능 
let u:undefined = undefined
let n:null = null

//이렇게 사용하면 에러남
//컴파일 옵션에서 --strictNullChecks를 사용하면 가능 
//void는 사용 가능
//let name:string = null 
//let age:number = undefined

//나중에 나올 union type을 사용해야됨
let union:string|null|undefined = null
union = 'asd'

null은 값이 없는 상태, undefined는 선언은 되었지만 사용되지 않은 상태

 

object

// create by object literal

const person1 = {name:'Mark', age:39}
//person1 not object type
//person1 is "{name:string, age:number}" type.

// create by Object.create
const person2 = Object.create({name:'Mark', age:39})/
//object | null type으로 표시된다.

프리미티브 타입이 아닌것을 나타내고 싶을때 사용하는 타입

사용예제

let obj:object = {}
obj = {name:'Mark'}
obj = [{name:'Mark'}];
// obj = 39 error

 

Array

같은 타입의 요소들을 모아놓은 타입 

 

//자바스크립트에서는 array는 객체
//사용방법 
//array

let list:number[] = [1,2,3]
let list2:Array<number> = [1,2,3]

Tuple

다른 타입의 요소들을 모아놓은 타입

길이가 정확해야한다.

//튜플은 앞뒤로 다른 타입을 넣게 된다. 
//순서도 타입도 다 맞아야한다. 
let x:[string, number];
x = ["hello", 39]

//유연하게 크기를 늘릴 수 없음
//x[2] = "world" // 오류 

const person:[string, number] = ["Mark", 39]
const [first, second] = person //분해 할당



//만약 number와 string을 같이 쓰고 싶으면 union을 사용해야된다.
let list3:(number|string)[] = [1,2,3,"4"]

any

어떤것이나 된다. 어떤것도 할 수 있다.

이걸 최대한 쓰지 않는게 핵심

컴파일 타임에 타입체크가 정상적으로 이뤄지지 않는다.

 

모든 편의는 타입안전성을 잃는 대가로 돌아온다는것을 기억하자.

 

function returnAny(message:any):any {
    console.log(message)
}

const any1 = returnAny('리터은 아무거나')

//이때부터는 any1은 제약을 받지 않는다.

unknown

응용프로그램을 작성할때 모르는 변수의 타입을 묘사해야될 때도 있다. 

컴파일러와 미래의 코드를 읽는 사람에게 이 변수가 어떤한 변수값이 될 수 있다는것을 알려줘야한다.

타입을 한정시켜야지만 사용가능하다.

 

declare const maybe:unknown;

//const aNumber:number = maybe; unknown은 nubmer에 바로 할당 불가

if (maybe === true) {
    //이 if문 안에서 maybe는 boolean형임
    const aBoolean :boolean = maybe;
    //const aString:string = maybe; 
}

if (typeof maybe === 'string') {
    // 이 안에서 maybe는 string이 된다.
    const aString:string = maybe;
}

 

never

return에 사용된다.

모든 타입의 서브타입, 모든 타입에 할당 가능

never는 그 어떤것도 할당 불가, any도 할당 불가

잘못된 타입을 넣고자하는 실수를 방지하려고 할때 ...사용

function error(message:string):never {
    //아무것도 리턴되지 않는다. 
    throw new Error(message);
}

function fail() {
    //리턴값이 never로 추론됨
    return error('failed');
}

function infiniteLoop() :never {
    while(true) {

    }
}

 

void

undefined가 있기 때문에 자주 사용하지 않음

값은 없고 타입만 있음

변수에다 사용하지 않음, 값을 반환하지 않는 함수에서만 사용