inflearn logo
강의

Course

Instructor

All About TypeScript

질문 드립니다.

Resolved

375

aa aa

2 asked

0

스크린샷 2023-05-17 오후 8.29.54.png

 

스크린샷 2023-05-17 오후 8.30.04.png

keyof 강의를 듣다가 생긴 에러인데요

prt 함수에서 key의 타입을 string으로 주면 저렇게 에러가 뜨는데

이유를 봐도 이해가 잘 가지 않아서 질문드립니다.

혹시 단순히 string으로 타입을 주면 params의 프로퍼티 키인지 타입스크립트가 알 수 없어서

에러가 뜨는 것인가요?

typescript Deno nestjs

Answer 2

1

yongsoocho

안녕하세요 :)

먼저, 질문주셔서 감사합니다. 제가 개인적인 업무가 너무 많아 답변이 늦어진점 죄송합니다.

혹시 단순히 string으로 타입을 주면 params의 프로퍼티 키인지 타입스크립트가 알 수 없어서 에러가 뜨는 것인가요? -> 이게 정답입니다.

구체적으로 설명을 해보자면 위 예시에서 타입스크립트는 title, publisher, price, author 만 key 값에 들어갈 수 있다고 판단하겠죠? 반면 string 타입은 너무 넓습니다. 그래서 string 타입의 범위를 줄여주어야합니다. 이러한 행위를 타입가드라고 합니다.

여러 방법이 있는데 대표적으로
1. if 문
2. keyof

방법이 있습니다.

0

aa aa

친절한 답변 감사드립니다!

타입가드에 대해서도 따로 공부를 해보겠습니다!

1

communityai8509

안녕하세요, 인프런 AI 인턴이에요.

keyof 연산자는 객체 타입의 프로퍼티 키를 문자열 리터럴 유니온 타입으로 가져오는 연산자에요. 따라서 keyof 연산자를 이용하여 반환된 값은 문자열 리터럴 유니온 타입(string | number | symbol) 이 됩니다.

prt 함수에서 key의 타입을 string으로 주면, params 객체에서 해당 문자열 키가 있는지 검사할 수 없기 때문에 컴파일러가 에러를 발생시키게 되는 것이죠.

따라서, key의 타입을 keyof T와 같이 타입 매개변수로 받아주어야 합니다. 이렇게 함으로써 keyof 연산자로 추출할 수 있는 값의 타입을 params 객체의 프로퍼티 키 집합으로 한정할 수 있게 됩니다.

더 자세한 내용이 궁금하시다면, TypeScript 공식 문서에서 keyof 연산자에 대해 찾아보시기를 추천드립니다.

도움이 되었길 바랍니다.

제네릭 클래스 핸드북 페이지가 undefined라고 나옵니다.

0

8

1

타입 주석

0

48

1

BuilderInit 사용 이유

0

409

1

ts-node extends시 에러가 발생합니다 ㅠㅠ

0

836

1

데코레이터-2 강의 질문이 있습니다.

0

284

1

enum 질문이 있습니다.

0

330

1

색션 2, 데코레이터 개념이 아예 이해가 안됩니다.

0

539

1

변수의 타입에 클래스를 지정해준 것과 지정 안한 것 과의 차이가 어떻게 되는지 궁금해서 질문을 남깁니다.

0

369

2

섹션4 예제0 질문입니다.

0

719

2

제네릭 extends관련질문 있습니다.

0

367

1

안녕하세요 정말 좋은 강의 감사합니다

0

381

1

하나의 인터페이스와 여러 버전의 클래스에 관한 질문

0

413

1

!과 타입 단언 (보충) 질문

0

404

1

화살표 함수에서 this

0

435

1

constructor질문

0

262

1

타입 단언과 관련해서 질문드립니다.

0

651

1

extends와 implements질문 드립니다.

0

302

1

as와 변수의 타입 지정 차이

0

353

1

undefined형식 에러

0

398

1

질문드립니다.

0

264

1

리터럴 타입 질문드립니다.

0

333

1

변수들이 var로 변합니다.

0

528

1

코딩 초보

0

462

1

service계층과 데이터베이스 요청 주고받을 때 Builder패턴 질문

0

1760

1