TypeScript

[TypeScript] 기본 타입

킹왕짱지지 2024. 3. 19. 15:27

ts와 js를 같이 켜 두면 안된다! 중복 함수 오류가 발생함!! js 끄기!!

 

타입스크립트가 바닐라 자바스크립트보다 유용한 이유 : 오류를 미리 감지하고 일부 런타임 오류를 방지할 수 있음

function add(n1, n2) {
    return n1 + n2;
}
var number1 = 5;
var number2 = 1.8;
var result = add(number1, number2);
console.log(result);

// 결과는 6.8
function add(n1, n2) {
    return n1 + n2;
}
var number1 = '5';
var number2 = 1.8;
var result = add(number1, number2);
console.log(result);

// 결과는 51.8
// js 가 number2를 문자열로 변환해서 문자열로 합침

 

 

타입스크립트에게 타입 알려주는 법!

- 명시적으로 타입설정하는 것은 타입스크립트만 이해하는 것! 

- Const number1 = 5 로 타입 명시를 하지않아도 실행되는 것은 타입스크립트가 타입 추론을 하기 때문이다. 따라서 const number1 : number = 5; 이런식으로 하는 건 쓸데없는 짓.

-타입스크립트의 타입은 컴파일 중에 확인되는 반명, 자바스크립트의 타입은 런타임 중에 확인됨

 

function add(n1:[number/string/boolean], n2) {

 

타입스크립트에서 타입 확인하는 법! 

console.log(typeof 변수명)

 

++

var : 재선언 및 업데이트 가능. 

    var name = 'bathingape'
    console.log(name) // bathingape

    var name = 'javascript'
    console.log(name) // javascript

let : 변수 재당 가능

    let name = 'bathingape'
    console.log(name) // bathingape

    let name = 'javascript'
    console.log(name) 
    // Uncaught SyntaxError: Identifier 'name' has already been declared
    // let으로 또 할당할 수 없음!!!

    name = 'react'
    console.log(name) //react

const : 변수 재선언, 변수 재할당 모두 불가능

    const name = 'bathingape'
    console.log(name) // bathingape

    const name = 'javascript'
    console.log(name) 
    // Uncaught SyntaxError: Identifier 'name' has already been declared

    name = 'react'
    console.log(name) 
    //Uncaught TypeError: Assignment to constant variable.

 

배열 타입

 

튜플 타입

튜플은 독특한 타입이므로 정의를 해줘야함 

const person: {
  name: string;
  age: number;
  hobbies: string[];
  role: [number, string];
} = {
  name: "hi",
  age: 20,
  hobbies: ["Sports", "Cooking"],
  role: [2, "author"],
};


person.role = [0, "hi"]; //만약 person.role = [0, "hi", "hello"];이런식으로 더 추가하면 오류 발생함.
person.role.push('admin'); //작동되는 이유 : push는 튜플에서 이용되는 일종의 예외, 타입스크립트에서 오류를 잡지 못함,
person.role[1]=10; //오류 발생 : Type 'number is not assignable to type 'string'

 

열거형

enum Role {
  Admin, // 0부터 시작하기 싫으면 Admin=5 이런식으로 해주면 되고 이후는 6, 7, 8...이 됨 또는 각각 다 값 설정도 가능(텍스트와 숫자 섞기도 가능)
  Read_Only,
  Author,
}

// 이런식으로도 할 수 있으나 모두 상수형으로 지정해야 하는 만큼 열거형(상수들의 집합)으로 하는게 낫다. 
// const Admin = 0;
// const Read_Only = 1;
// const Author = 2;

const person = {
  name: "hi",
  age: 20,
  hobbies: ["Sports", "Cooking"],
  role: Role.Admin,
};

if (person.role === Role.Admin) {
  console.log("Admin");
}

 

 

Any 

- 타입 중 가장 유연한 타입

- 타입스크립트에게 아무것도 알려주지 않음 ; 어떤 값이든 저장할 수 있다. 

- 하지만 ts 에서 별로 유용하진 않음. ts 장점 활용못하니까 e.g) let list=any[]; list=['sport'] 이런식으로 하나만 넣으면 오류 발생

- 어떤 값과 데이터가 들어올 지 모를때 쓰는거

- 가급적 사용X

 

유니언 타입

- 애플리케이션에서 함수의 매개변수나 상수 혹은 변수가 두 가지 다른 종류의 값을 받을 수 있을때 사용하면 타입스크립트에게 숫자나 문자열 둘 다 괜찮다고 알려주는 것

 

오류코드 1) 

function combine(input1: number|string, input2: number|string) {
  const result = input1 + input2;
  return result;
}

- 이런 식으로 하면 + 연산자를 사용할 수 없다는 오류가 나타나는데 타입스크립트가 유니온에 뭐가 들어오는지 안보고 그냥 안될 수도 있으니까 오류띄움ㅇㅇ 이렇게 하는 것 

 

수정 방법 

function combine(input1: number | string, input2: number | string) {
  let result;
  if (typeof input1 === "number" && typeof input2 === "number") {
    result = input1 + input2;
  } else {
    result = input1.toString() + input2.toString();
  }

  return result;
}

const combineAge = combine(20, 21);
console.log(combineAge);

const combineNames = combine("mimi", "zizi");

 

추가

function combine(
  input1: number | string,
  input2: number | string,
  resultConversion: string
) {
  let result;
  if (typeof input1 === "number" && typeof input2 === "number") {
    result = input1 + input2;
  } else {
    result = input1.toString() + input2.toString();
  }
  if (resultConversion === "as-number") {
    return +result; //또는 paresFloat(result) 하면 숫자로 변환됨
  } else {
    return result.toString();
  }
}

const combineAge = combine(20, 21, "as-number");
console.log(combineAge);

const combineStringAge = combine("20", "21", "as-number");
console.log(combineStringAge);

const combineNames = combine("mimi", "zizi", "as-text");
console.log(combineNames);

 

그런데 계속 number | stirng 이렇게 쓰기에는 너무 귀찮아?

알리어스(Alias) 타입 

-유니언 타입과 같이 많이 씀

type Combinable = number | string;
type ConversionDespription = "as-number" | "as-text";

function combine(
  input1: Combinable,
  input2: Combinable,
  resultConversion: ConversionDespription
) {

 

추가

예를 들어, 다음 코드를 아래와 같이 단순화할 수 있습니다.

function greet(user: { name: string; age: number }) {
  console.log('Hi, I am ' + user.name);
}
 
function isOlder(user: { name: string; age: number }, checkAge: number) {
  return checkAge > user.age;
}


단순화 후:

type User = { name: string; age: number };
 
function greet(user: User) {
  console.log('Hi, I am ' + user.name);
}
 
function isOlder(user: User, checkAge: number) {
  return checkAge > user.age;
}

 

Void 타입

 

- js에는 void 타입이 없으나 ts가 알아서 하니까 굳이 명시할 필요없이 사용 가능

- 반환 구문이 없음 : undefined

- undefined 자체가 ts에는 함수가 될 수 있음. 근데 거의 선언은 안함

 

// add의 결과값이 출력이 되는 것- 1차add 2차 printresult값 출력이 되어야하는데 한줄만 뜨니까
function add(n1: number, n2: number) {
  return n1 + n2;
}

function printResult(num: number) {
  console.log("Result: " + num);
}

printResult(add(5, 12));


// 이렇게 하면 add 다음줄 undefined가 뜸
function add(n1: number, n2: number) {
  return n1 + n2;
}

function printResult(num: number) {
  console.log("Result: " + num);
}

console.log(printResult(add(5, 12)));

 

Function(함수) 타입

- 함수를 정의하는 타입

- 매개변수와 함수의 반환값까지 정의

- 화살표 표기법으로 만들 수 있음. 

//변수를 통해 함수 실행
let combineValues; //기본 타입은 any인데 이렇게하면 문제가 생길 수 있음
//comvines = 5라고 하면 오류가 발생
combineValues = add;
console.log(combineValues(8, 8));


//수정방법 - 하지만 여전히 완벽하지 않음 comvineValues를 void타입으로 하면 ts는 조건 만족했다고 하지만 우리는 만족하지 못해! undefined가 뜨거든
// (잘못된 함수 저장 그러나 ts는 알려주지 않음)
let combineValues: Function;
combineValues = add;
console.log(combineValues(8, 8));


//수정 방법 - 저장할 함수가 어떻게 동작해야 할 지 더 정확히 정의해야함! 
let combineValues: (a:number, b: number) => number;
combineValues = add;
console.log(combineValues(8, 8));

 

 

Call back(콜백) 함수

- 장점 : 함수안에서 콜백을 전달하면 타입스크립트는 결과가 숫자라는 것을 추론함. 그러면 결과를 가지고 뭐든 할 수 있음

 

//cb 부분이 콜백함수
function addAndHandle(n1: number, n2: number, cb: (num: number) => void) {
  const result = n1 + n2;
  cb(result);
}

addAndHandle(10, 20, (result) => {
  console.log(result);
});

 

Unknown 타입

- 오류 없이 어떤 값이든 저장할 수 있음

- 그러나 any와는 다름! 왜냐면 unknown은 string이 아닐 수도 있기 때문. 더 제한

e.g.

let userInput: unknown; //여기가 any면 오류 발생 안함!!
let userName:string;

userName=userInput; //오류 발생!!


// 이렇게는 가능하다
if (typeof userInput === "string") {
  userName = userInput;
}

- 따라서 unknown은 타입 체크를 하기는 함!

 

Never 타입

- 절대 값을 생성하지 않음

//유틸리티 함수
function generateError(message: string, code: number) {
  throw { message: message, errorCode: code };
}

const result = generateError("An error occured!", 500);
console.log(result); //never 반환: 절대 값을 생성하지 않음

'TypeScript' 카테고리의 다른 글

[TypeScript] 타입스크립트 컴파일러  (0) 2024.03.27
[TypeScript] 기본 설정  (0) 2024.03.19