티스토리 뷰

반응형

 

 

 

참고문헌 :

typescriptlangHandbook - The TypeScript Handbook

 

Handbook - The TypeScript Handbook

Your first step to learn TypeScript

www.typescriptlang.org

typescriptlangHandbook - The TypeScript Handbook

https://www.typescriptlang.org/ko/docs/handbook/2/basic-types.html

 

Documentation - The Basics

TypeScript를 배우는 첫 걸음: 기본 타입.

www.typescriptlang.org

 

검색 : 타입스크립트의 타입 계층 구조 - 이미지 검색

 

★ 기본 타입

 

1. 원시 타입(Primitive Type)

      a. 통시에 한 개의 값만(숫자만 숫자, 문자열 이면 문자열만,..) 저장할 수 있는 타입틀

      b. number, sring, boolean

      1-1.number 타입

let num1:number = 123;     // 타입 주석 사용
let num2:number = -123;
let num3:number = 0.123;
let num4:number = -0.123;
let num5:number = Infinity;
let num6:number = -Infinity;
let num7:number = NaN;

num1.toFixed(2);  //소수이하 2자리
num1.toFixed(); //소수 없이, 정수만
num1 = "hi";  //에러 발생
num2.toLowerCase(); //에러 발생

● 타입 주석 또는 타입어노테이션 : 변수 이름 뒤에 콜론(:)과 함께 변수의 타입을 정의하는

 

1-2.string 타입

      문자열 타입, "",",백틱,템플릿 리터럴로 만든 모든 문자열을 포함

//string
let str1 : string ="hello";
let str2 : string ='hello';
let str3 : string =`hello`;
let str4 : string =`hello ${num1}`;

 

1-3. boolean 타입

//boolean
let bool1 :boolean = true;
let bool2 :boolean = false;

 

1-4. null 타입

//null
let nullable : null = null;

//let numA : number = null;  //타입스크립트는 null 타입이 따로 있어 오류
              // 이를 해결하기 위해 tsconfig.json에  "strictNullChecks": false 추가
              // strictNullChecks 는 strict의 하위 옵션으로  strict 가 true로
              // 설정되어 있으면 이것도 true가 되며 false 로 설정되어 있으면 
              // 자동 false가 됨
              // 현재는 strict 모두를 true로 해 놓았기에 strictNullChecks 도  true 임

 

● strictNullChecks 는 strict의 하위 옵션으로 strict 가 true로 설정되어 있으면 이것도 true가 되며 false 로 설정되어 있으면 자동     false가 됨, 현재는 strict 모두를 true로 해 놓았기에 strictNullChecks 도 true 임

● strict 를 활성화 해 놓으면 strict~~ 모든 플래그를 동시에 활성화하게

 

1-5. undefined 타입

//undifined
let undefinded_test : undefined = undefined;

 

2. 리터럴 타입

    ● 하나의 값만 포함하도록 값 자체로 만들어진 타입

    ● 값 그 자체로 정의

    ● 해당 값 이외에는 담을 수 없

//리터럴 타입 : 값 그 자체로 정의
let numA :10 = 10;
//numA = 20;  // 10외는 넣을 수 없음

let strA :"hello" = "hello";

let boolA : true = true;

 

 

※ 배열과 튜플

1. 배열(Array)

      ● 변수 : 배열 요소 타입[] = [값,...];

      ● Array<배열_요소_타입> : 제레닉

      ● 다양한 타입을 갖는 배열 요소 => 변수:(타입1|타입2|..) = [타입1값,타입2값,....)

          ○ 유니온 타입 : 바(|), 여러 요소 중 하나를 만족하는 타입을 의미

      ● 다차원 배열

          ○ 변수:타입[][] = [[요소1,요소2,.. ],[ 요소1,요소2,....]];

//배열
let numArr: number[]=[1,2,3];
let strArr: string[]=["사과","딸기","복숭아"];

let boolArr:Array<boolean> =[true,false,true]; //제레닉

//배열에 들어가는 요소들의 타입이 다양할 경우  - 유니온(Union) 타입
let multiArr:(number | string)[] = [1, "hello"];

//다차원 배열의 타입을 정의하는 방법
let doubleArr:number[][] =[
  [1,2,3],
  [4,5]
];

//--------------------
let numArr : number[] = [1,2,3,4];
console.log(numArr[2]);

let num_str:(number | string)[ ] = [1, "사과"];
num_str.push(3);
num_str.push(5);
num_str.push("딸기");
num_str.push("복숭아");
console.log(num_str);

- tsx src/파일명. ts

- tsc src/파일명.ts -> node src/파일명.js

 

2. 튜플(Tuple) 타입

      ● 타입스크립트에서 만 제공

      ● 길이와 타입이 고정된 배열

      ● 다만 js로 변경되면 튜플도 일반 배열로 변환되어 처리됨

      ● 따라서 배열 메서드인 push나 pop을 이용해서 고정된 길이를 무시하고 요소를 추가하거나 삭제할 수 있음에 주의 필요

      ● 튜플을 사용하면 실수로 배열의 위치를 변경해서 저장하는 에러를 막을 수 있음

//튜플 타입 - 타입스크립트에서만 제공
//튜플 - 길이와 타입이 고정된 배열
let tup1:[number,number] =[1,2];
let tup2:[number,string] =[1,'hello'];

tup1 = [3, 4];
// tup1=[3,4,5]; //에러, 튜플
// tup1 = ["가나","다라"]; //에러

// tup2 = [3, 4]; //에러
// tup2 = ["가", 3]; //에러
tup2 = [5, "대한"];

let tup3:[number,string,boolean] = [1, "사과", true];
tup1.push(4);  //가능,  주의) 자바스크립트로 변환할 때 그냥 배열로 처리하기 때문에 가능
tup1.pop();
tup1.pop();
tup1.pop();

//튜플 상황-인덱스에 넣어야 할 타입이 정해져 있을 때
const user:[string,number][]=[
  ["홍길동",1],
  ["이가",2],
  ["홍동",3],
  ["박박",4],
  // [6, "최최"] //오류
];

 

 

 

※ 객체

1. object로 정의하기

      a. object 타입은 단순 값이 객체임을 표현하는 것 외에는 아무런 정보도 제공하지 않는 타임

      b. 이 타입은 객체의 프로퍼티(Property)에 대한 정보를 전혀 가지고 있지 않음

      c. 따라서 프로퍼티(Property)에 접근하려고 하면 오류 발생

let user:object={
  id:1,
  name:"홍길동",
};

user.id;  //에러 발생, 단지 object는 객체임을 표현할 뿐
        // 객체의 프로퍼티에 대한 정보가 없음음

 

2. 객체 리터럴 타입

      a. 중괄호({})를 열고 객체가 갖는 프로퍼티(Property)를 직접 나열해 만드는 타입

      b. 변수의 타입을 객체의 리터럴 타입으로 정의하면 타입 내에 정의되어 있는 프로퍼티(Property)에 이상 없이 접근할 수 있음

      c. 프로퍼티에 마우스 올려 놓으면 타입이 보임

      d. 객체의 타입을 정의할 때 프로퍼티를 기준으로 객체의 구조를 정의하듯이 타입을 정의(구조적 타입 시스템)

let user: {   //객체 리터럴 타입, 구조적 타입 객체
  id:number; 
  name:string;
}={
  id:1,
  name:"홍길동",

};
console.log(user.id);
console.log(user.name);

user ={
  id : 2,
  name: "김자바",
}

console.log(user.id);
console.log(user.name);

 

3. 선택적 프로퍼티(Optional Property)

      ● 프로퍼티가 있어도 되고 없어도 되는 선택적 상황에서 사용

      ● 프로퍼티 이름 뒤에 ?를 붙여서 나타냄

let user: {   //객체 리터럴 타입, 구조적 타입 객체체
  id?:number; //? 있어도 되고 없어도 되는 프로퍼티, 옵셔널 프로퍼티
            // id를 지정할 것이면 숫자값이어야 함함
  name:string;
}
={
  id:1,
  name:"홍길동",

};
user.id;

user={
  name:"홍홍홍",
};

 

4. 읽기 전용 프로퍼티(Readonly Property)

      ● 프로퍼티 이름 앞에 'readonly' 키워드를 붙여 줌

      ● 의도치 않은 프로퍼티의 값 수정을 방지하기 위해 사용

let config:{
  readonly apiKey : string;
} ={
  apiKey : "My Test Api Key",
};

// config.apiKey ="aaaa "; //에러, 읽기 전용이므로

 

 

▶ 타입 별칭 및 인덱스 시그니처

 

1. 타입 별칭

      ● 타입 별칭을 이용하면 변수를 선언하듯 타입을 별도로 정의할 수 있음

      ● 형시) type 타입명 = { 타입선언};

type User={  //객체 타입 정의, type 타입명 ={ };
  id: number;   //프로퍼티:number
  name:string;
  nickname:string;
  birth:string;
  bio:string;
  location:string;
};

let user:User={ // 타입 별칭 사용  let 객체명:타입별칭={ }
  id: 1,
  name:"이바다",
  nickname:"바다신",
  birth: "1999-01-02",
  bio:"Hello",
  location:"서울 강남"
};

let user2:User={
  id: 2,
  name:"이하늘",
  nickname:"sky",
  birth: "1999-03-01",
  bio:"ㅋㅋㅋㅋㅋ",
  location:"역삼"
};

● 동일한 스코프 내에서는 중복된 이름으로 타입 별칭 선언하면 에러 변수 선언과 유사

● 그러나 함수 내에 정의된 별칭과 함수 외부에 정의된 타입 별칭 처럼 스코프가 다르면 동일해도 됨

 

2. 인덱스 시그니처

    객체 타입을 유연하게 정의할 수 있도록 돕는 특수한 문법

    형식) [key:type] : value_type;

    ex) [key:string]:number ; ⇒ key는 string 타입이고 value는 number 타입인 모든 프로퍼티를 포함

type ContryCodes={
  [key : string] : string;
};

let countryCodes:ContryCodes={
  Korea : "ko",
  UnitedState:"us",
  Japan : "jp",
};

//아래와 같이 
// 인덱스 시그니처 타입은 규칙을 위반하지만 않으면 에러 안 생김
let countryNmberCodes :CountryNumberCodes ={};

let countryNmberCodes :CountryNumberCodes ={
  Korea:410,
  UnitedState: 840,
  Japan : 392,
};

 

만약 반드시 포함해야 할 프로퍼티가 있다면 다음과 같이 직접 명시해도 됨

type CountryNumberCodes={
  [key:string]:number;
  Korea:number;
};

let countryNmberCodes :CountryNumberCodes ={
  Korea:410,
};


// 그러나 위의 Korea:type과 value타입은 반드시 같아야 함
type CountryNumberCodes={
  [key:string]:number;
  //Korea:string; //에러, value 타입이 number이므로 여기도
  // number 타입이거나 호환되는 타입이어야 함
  Korea:number;
};

let countryNmberCodes :CountryNumberCodes ={
  //Korea:"ko" , //에러, number 타입이어야 함
  Korea:1;
};

 

 

☎  열거형 타입

 

      ● 자바스크립트에는 존재하지 않고 오직 타입스크립트에서만 사용할 수 있는 특별한 타입

      ● enum은 컴파일될 때 다른 타입들 처럼 사라지지 않고 자바스크립트 객체로 변환됨

      ● enum 타입에 값을 직접할당 하지 않으면 0부터 시작하고 1씩 증가함

 

// 숫자형 열거 타입
enum Role {
  ADMIN,  // 0 할당
  USER,  //1 할당
  GEUEST, //2 할당
};

//
// enum Role {
//   ADMIN=0,
//   USER=1,
//   GEUEST=2,
// };

//
// enum Role {
//   ADMIN=10, // 10 
//   USER,    // 11
//   GEUEST,   // 12
// };


//문자열 열거형
enum Language{
  korean = "ko",
  english = "en",
};

let user1 = {
  name:"홍길동",
  role:Role.ADMIN,

};

let user2 = {
  name:"김하늘",
  role:Role.USER,
  language : Language.korean,
};

let user3 = {
  name:"이바다",
  role:Role.GEUEST,
  language : Language.english,
};

 

● 위 코드를 js 파일로 변환 ( tsc src/test.ts )

var Role;
(function (Role) {
    Role[Role["ADMIN"] = 0] = "ADMIN";
    Role[Role["USER"] = 1] = "USER";
    Role[Role["GUEST"] = 2] = "GUEST";
})(Role || (Role = {}));
var Language;
(function (Language) {
    Language["korean"] = "ko";
    Language["english"] = "en";
})(Language || (Language = {}));
;
var user1 = {
    name: "홍길동",
    role: Role.ADMIN,
};
var user2 = {
    name: "김하늘",
    role: Role.USER,
    language: Language.korean,
};
var user3 = {
    name: "이바다",
    role: Role.GUEST,
    language: Language.english,
};

 

 

★ Any와 Unknown 타입

1. Any 타입

      ● 타입스크립트에서만 제공되는 특별한 타입으로 타입 검사를 받지 않는 특수한 치트키 타입

      ● any 타입은 어떠한 타입 검사도 받지 않기 때문에 아무 타입의 값이나 범용적으로 담아 사용할 수 있고, 다양한 타입의 메서             드도 마음대로 호출해서 사용해도 문제가 되지 않음

      ● any 타입의 값은 어떤 타입으로 정의된 변수던 문제 없이 다 할당할 수 있음

      ● any는 되도록 사용하지 않은 것이 좋음, 상당히 위험한 타입임, 타입 검사는 하지 않지만 runtime에 오류를 발생시킴

//any
// 특정 변수의 타입을 확실히 모를 때 사용
let anyVar:any=10;
anyVar = "hello";

anyVar = true;
anyVar ={};
anyVar=() => { };

anyVar.toUpperCase();
anyVar.toFixed();

let num :number = 10;
num = anyVar;

 

2. Unknown 타입

      ● any 타입과 비슷하지만 보다 안전한 타입

      ● unknown 타입의 변수는 어떤 타입의 값이든 다 저장할 수 있음

      ● 그러나 unknown 타입의 값은 어떤 타입의 변수에도 저장할 수 없음

      ● unknown 타입의 값은 어떤 연산에도 참여할 수 없으며, 어떤 메서드로 사용할 수 없음

      ● 모든 값을 할당 받을 수 있지만, 어떤 타입의 변수에도 할당할 수 없고, 모든 연산에 참가할 수 없게 됨

      ● 즉 모든 값을 저장만 할 수 있음

//unknown
let unknownVar:unknown;
unknownVar = "";
unknownVar = 11;
unknownVar = () => {};

// num = unknownVar;
// unknownVar.toUpperCase();

if(typeof unknownVar === "number"){
  //타입 정제 = 타입 좁히기 시는 사용 가능
  num=unknownVar;
}

 

 

▶ Void 타입과 Never 타입

 

1. void 타입

      a. 아무런 값도 없음을 의미하는 타입

      b. 아무런 값도 반환하지 않는 함수의 반환값 타입을 정의할 때 사용

      c. void타입의 변수에는 undefiend 이외의 다른 타입의 값은 담을 수 없음, void 타입이 undefiend 타입을 포함하는 타입이기              때문

 

//void

function func1():string{
  return "hello";
}

function func2():void{
  console.log("hello");
};

let a:void;
// a=1;
// a="hello";
// a={};
a=undefined;
//a=null;  //tsconfig.json에 엄격한 null 검사 옵션을 false로 설정하면 가능
        // "strictNullChecks":false

 

2. never 타입

      a. 불가능을 의미하는 타입

      b. 함수가 어떠한 값도 반환할 수 없는 상황일 때 해당 함수의 반환값 타입을 정의할 때 사용

      c. 무한 루프 이외에 의도적으로 오류를 발생시키는 함수도 never 타입으로 반환값 타입을 정의할 수 있음

      d. 변수의 타입을 never로 정의하면 any를 포함해 그 어떠한 타입의 값도 이 변수에 담을 수 없게 됨

 

//never 
//존재하지 않는 불가능한 타입
// 함수에 반환값 자체가 모순이라고 생각할 수 있는 상황에도 never타입 사용
function func3():never{
  while(true){ }
}

function func4():never{
  throw new Error();
}

let anyVar:any;
let a1 : never;
// a1=1;
// a1={};
// a1="";
// a1=undefined;
// a1=null;  //tsconfig.json에 엄격한 null 검사 옵션을 false로 설정해도
//         //null을 담을 수 없음
// // "strictNullChecks":false
// a1=anyVar;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Front-End Programming > JavaScript' 카테고리의 다른 글

타입스크립트란(TypeScript)  (0) 2025.08.07
변수  (0) 2025.03.25
정리문제  (1) 2025.03.25
자바스크립트 수업 자료  (0) 2025.03.25
자바스크립트 수업 자료  (2) 2025.03.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함