수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결타입스크립트의 모든 것
BuilderInit 사용 이유
안녕하세요~ 좋은 강의 감사합니다~spring 3년 정도 사용하다가 이번에 이직 하면서 nest.js를 사용하게 되어 강의 듣고 있는데요. js지식이 얕아서 간혹 이해 안되는 부분이 생기더라구요.찾아보면서 진행하고 있긴한데 이번강의의 BuilderInit클래스를 추가해주신 부분이 이해가 잘되지 않아서 문의드려요~ 데코레이터는 "값 조작 은 인스턴스화 해서 실행해야 한다"라고 지난 강의에서 말씀해주셨는데new PostEntity.Builder()를 하였을 때 컴파일 타임에 Builder() 와 멤버변수()를 인식하지못해서 사용하는 건가요? class BuilderInit {static Builder = class {build() {};[props: string]: Function;}}이 문법도 잘이해가 가질 않지만, 메소드의 시그니처를 정의해주는걸로 보이는데요(?), build()가 있어야 하는 이유가 뭘까요? build()도 정의해주는 것으로 봤는데 없애도 문제없이 동작하더라구요.
- 해결됨타입스크립트의 모든 것
ts-node extends시 에러가 발생합니다 ㅠㅠ
tsconfig.json에서"extends": "@tsconfig/node16/tsconfig.json", extends를 하고 다시 ts-node 명령어를 실행하면 아래와 같이 에러가 발생합니다.tsconfig.json을 주석처리하고 ts-node를 하면 잘 수행됩니다..! /usr/local/lib/node_modules/ts-node/src/index.ts:859 return new TSError(diagnosticText, diagnosticCodes, diagnostics); ^ TSError: ⨯ Unable to compile TypeScript: error TS6053: File '@tsconfig/node16/tsconfig.json' not found. at createTSError (/usr/local/lib/node_modules/ts-node/src/index.ts:859:12) at reportTSError (/usr/local/lib/node_modules/ts-node/src/index.ts:863:19) at createFromPreloadedConfig (/usr/local/lib/node_modules/ts-node/src/index.ts:874:36) at phase4 (/usr/local/lib/node_modules/ts-node/src/bin.ts:543:44) at bootstrap (/usr/local/lib/node_modules/ts-node/src/bin.ts:95:10) at main (/usr/local/lib/node_modules/ts-node/src/bin.ts:55:10) at Object.<anonymous> (/usr/local/lib/node_modules/ts-node/src/bin.ts:800:3) at Module._compile (node:internal/modules/cjs/loader:1376:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1435:10) at Module.load (node:internal/modules/cjs/loader:1207:32) { diagnosticCodes: [ 6053 ] }현재 노드 버전 : v17.0.1노드를 완전 삭제 및 다시 설치해도 동일한 현상이 발생하고노드 버전을 올리고 내려도 동일한 현상이 발생하네요..혹시 해당 에러가 왜 발생할까요? ㅠㅠ검색을 해도 잘 나오지가 않네요 ㅠㅠ
- 해결됨타입스크립트의 모든 것
데코레이터-2 강의 질문이 있습니다.
데코레이터-2 강의에서 팩토리 안에 있는 데코레이터 함수를 실행하면 첫번째 인자인 target: Function쪽에는 강의와 다르게 빈값({})이 출력되는데요..! 혹시 이유를 아실까하여 여쭤봅니다..!tsconfig.json에서 말씀해주신 2개의 옵션 수정한 상태입니다.좋은 강의에 감사의 말씀 전달드립니다!!class HelloController { @Get("/api/v1/user") getRequest() {} } function Get(params: any): any { console.log("Get factory params : ", params); return ( target: any, propertyKey: string, descriptor: PropertyDescriptor) => { console.log("Get deco func : ", target); console.log("Get propertyKey : ", propertyKey); console.log("Get descriptor: ", descriptor); } } 출력값 Get factory params : /api/v1/user Get deco func : {} Get propertyKey : getRequest Get descriptor: { value: [Function: getRequest], writable: true, enumerable: false, configurable: true }
- 해결됨타입스크립트의 모든 것
enum 질문이 있습니다.
안녕하세요! 강의 잘 보구 있습니다.enum에는 값 외에 object나 함수를 지정할 수 없나요?java에서의 enum에서는 값 외에 행위나 인터페이스 등의 타입을 부여할 수 있어서 혹시 가능한지 여쭤봅니다 ㅎㅎ
- 미해결타입스크립트의 모든 것
색션 2, 데코레이터 개념이 아예 이해가 안됩니다.
안녕하세요. 타입스크립트 강좌 수강생 어민규입니다. 데코레이터를 이해하기 위해 필요한 기초지식들을 공부하기 위해 질문을 드립니다.JS가 코딩 입문언어로 그 외 언어들은 알지 못합니다. 그래서 데코레이터가 더 이해가 잘 안되는데요. 참고할만한 블로그나 기초 개념들을 알려주시면 감사하겠습니다.또한 데코레이터 -2 강의를 기반으로 한 프로그램에서 아래의 오류가 떠서 뭐가 문제인지 잘 모르겠습니다.// 데코레이터 - 2 // 팩토리 // : 데코레이터 함수를 리턴하면서 감싸고 있는 녀석 // f(g(x)) ----> f () { return g () }, g: 데코레이터 함수 // g ----> f(g(x)), f: 데코레이터 팩토리 (목적: 인자전달, param 전달) // 1. 데코레이터는 함수다 function Controller(constructor: any): any { console.log("Controller : ", constructor) return (target: any) => { console.log(target) } } function Get(params: any): any { // console.log("[GET] ", params) } function Post(params: any): any { // console.log("[GET] deco start") } function Column(params: any): any { // console.log("Column!!", params) } function UseGuard(): any { // console.log('UseGuard deco start') } // 2. 데코레이터는 무조건 class만 같이 쓴다. (내부 외부, 맴버 변수, 메소드, 파라미터...) // 데코레이터는 이렇게 쓴다. @Controller('/api/v1') class ExampleController { @Column('email') private _email: string; constructor(email: string) { this._email = email; // _email 변수를 생성자에서 초기화합니다. } @Get('/user') getReq() {} @Post('/board') postReq() {} } // 데코레이터 - 2 var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { if (result === void 0) continue; if (result === null || typeof result !== "object") throw new TypeError("Object expected"); if (_ = accept(result.get)) descriptor.get = _; if (_ = accept(result.set)) descriptor.set = _; if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { if (kind === "field") initializers.unshift(_); else descriptor[key] = _; } } if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; }; var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { var useValue = arguments.length > 2; for (var i = 0; i < initializers.length; i++) { value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); } return useValue ? value : void 0; }; var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) { if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); }; // 팩토리 // : 데코레이터 함수를 리턴하면서 감싸고 있는 녀석 // f(g(x)) ----> f () { return g () }, g: 데코레이터 함수 // g ----> f(g(x)), f: 데코레이터 팩토리 (목적: 인자전달, param 전달) // 1. 데코레이터는 함수다 function Controller(constructor) { console.log("Controller : ", constructor); return function (target) { console.log(target); }; } function Get(params) { // console.log("[GET] ", params) } function Post(params) { // console.log("[GET] deco start") } function Column(params) { // console.log("Column!!", params) } function UseGuard() { // console.log('UseGuard deco start') } // 2. 데코레이터는 무조건 class만 같이 쓴다. (내부 외부, 맴버 변수, 메소드, 파라미터...) // 데코레이터는 이렇게 쓴다. var ExampleController = function () { var _classDecorators = [Controller('/api/v1')]; var _classDescriptor; var _classExtraInitializers = []; var _classThis; var _instanceExtraInitializers = []; var __email_decorators; var __email_initializers = []; var _getReq_decorators; var _postReq_decorators; var ExampleController = _classThis = /** @class */ (function () { function ExampleController_1(email) { this._email = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, __email_initializers, void 0)); this._email = email; // _email 변수를 생성자에서 초기화합니다. } ExampleController_1.prototype.getReq = function () { }; ExampleController_1.prototype.postReq = function () { }; return ExampleController_1; }()); __setFunctionName(_classThis, "ExampleController"); (function () { var _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; __email_decorators = [Column('email')]; _getReq_decorators = [Get('/user')]; _postReq_decorators = [Post('/board')]; __esDecorate(_classThis, null, _getReq_decorators, { kind: "method", name: "getReq", static: false, private: false, access: { has: function (obj) { return "getReq" in obj; }, get: function (obj) { return obj.getReq; } }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(_classThis, null, _postReq_decorators, { kind: "method", name: "postReq", static: false, private: false, access: { has: function (obj) { return "postReq" in obj; }, get: function (obj) { return obj.postReq; } }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(null, null, __email_decorators, { kind: "field", name: "_email", static: false, private: false, access: { has: function (obj) { return "_email" in obj; }, get: function (obj) { return obj._email; }, set: function (obj, value) { obj._email = value; } }, metadata: _metadata }, __email_initializers, _instanceExtraInitializers); __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); ExampleController = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); })(); return ExampleController = _classThis; }(); 오류 메시지eominkyu@pisimingyuui-MacBookAir typeScript % tsc deco && node decoController : /api/v1/Users/eominkyu/Desktop/typeScript/deco.js:13 var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); ^TypeError: (0 , decorators[i]) is not a function at __esDecorate (/Users/eominkyu/Desktop/typeScript/deco.js:13:40) at /Users/eominkyu/Desktop/typeScript/deco.js:90:9 at /Users/eominkyu/Desktop/typeScript/deco.js:97:7 at Object.<anonymous> (/Users/eominkyu/Desktop/typeScript/deco.js:99:2) at Module._compile (node:internal/modules/cjs/loader:1254:14) at Module._extensions..js (node:internal/modules/cjs/loader:1308:10) at Module.load (node:internal/modules/cjs/loader:1117:32) at Module._load (node:internal/modules/cjs/loader:958:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:23:47Node.js v18.16.0
- 미해결타입스크립트의 모든 것
변수의 타입에 클래스를 지정해준 것과 지정 안한 것 과의 차이가 어떻게 되는지 궁금해서 질문을 남깁니다.
안녕하세요? 현 강의에서 user에 new UserInfo() 클래스를 할당하고 동시에 해당 변수에 타입으로 클래스를 할당할 수 있다고 하셨는데 그렇게 되면 본래 UserInfo 상단에 지정된 인자들의 타입을 한번 더 점검해준다는 뜻인가요?? 해당 부분이 이해가 안되서 질문을 남깁니다.
- 미해결타입스크립트의 모든 것
섹션4 예제0 질문입니다.
강의를 따라 타이핑 중 저의 VS에서는 다음과 같은 에러가 떳습니다.위의 this에서는 "this에는 형식 주석이 없으므로 암시적으로 any 형식이 포함됩니다." 라는 오류와밑의 new에는 "대상에 구문 시그니처가 없는 new 식에는 암식적으로 any 형식이 포함됩니다." 라는 오류가 떳습니다.해당 구문을 js 파일로 바꾸어 사용했을 땐 다음과 같이 문제가 없었습니다.어떤 문제일까요ㅠㅠ?tsconfig.json
- 미해결타입스크립트의 모든 것
제네릭 extends관련질문 있습니다.
function test<T extends object>(params:T){ params.hi()}위 코드에서 params.hi()는 타입을 보장할수 없다는 에러가 반환됩니다. 여기서 궁금한게 test<T extends object>를 해주었는데 왜 타입보장이 안된다구 하는지 모르겠습니다. 물론 hi의 타입을 몰른다 라구 하더라도 object 프로퍼티에 접근할때 dot으로 접근할수있는데 왜 타입 보장이 안된다고 하는걸까요??왜 따로 interface IHi를 만들어서 그거를 extends해줘야 하는것일까요?? 물론 IHi하면 타입을 좀더 촘촘하게 설정해주어서 params안에는 hi라는 메소드가 들어간다는걸 인지시켜줄순 있겠지만 그래도 오브젝트가 사용될수 없는 이유는 모르겠습니다.
- 미해결타입스크립트의 모든 것
안녕하세요 정말 좋은 강의 감사합니다
안녕하세요 정말 좋은 강의 감사합니다.혹시 vscode extension은 어떤거 쓰시는지 알수있을까요..?
- 미해결타입스크립트의 모든 것
하나의 인터페이스와 여러 버전의 클래스에 관한 질문
안녕하세요 :)예제에서 하나의 인터페이스로 설계하고 해당 인터페이스의 구현체를 여러 버전으로 만드셨는데 궁금한 점이 있습니다.만일 신규 버전을 생성할 때 인터페이스도 변경되면 기존 버전의 구현체들은 인터페이스와 불일치하여 오류 표시가 나는데, 오류가 나는 구버전 구현체들은 어떻게 처리를 해야할지 잘 모르겠습니다 ㅠㅠ..!우선 아래 사진과 같이 임시로 인터페이스에 맞게 구현하여 오류를 없애봤지만, 버전이 변경될 때마다 불필요한 리소스를 잡아먹는 작업인 것 같아 옳지는 않은 방향인 것 같아 질문드려요!
- 미해결타입스크립트의 모든 것
!과 타입 단언 (보충) 질문
이런식으로 변수에 값을 할당하면서 동시에 사용할수 있다고 하셨는데examples2 type을 object 선언후 as 로 IExam 을 감싸는 이유가 따로 있을까요저렇게 했을경우 value 프로퍼티 접근을할경우 빨간줄이 뜨는데 이럴땐 해결하는 방법이 따로 있을까요??
- 해결됨타입스크립트의 모든 것
화살표 함수에서 this
안녕하세요 :)좋은 강의 제공해주셔서 감사합니다. 덕분에 타입스크립트에 대해 많이 알아가고 있어요.이전 강의와는 달리 화살표 함수를 통해 클래스를 함수로 변환하셨는데 그 과정에서 궁금한 점이 있습니다.화살표 함수에서 this는 상위 컨텍스트의 this(영상 속 add 함수의 경우 전역 객체인 global)를 가리키므로, 작성해주신 add 함수에서의 _this는 IAdd가 아닌 globalThis가 맞는 게 아닌지 의문이 들어 질문드립니다. 제가 모르는 거나 놓치는 게 있어서 이해를 못 하는 것 같은데 알려주시면 감사하겠습니다 ㅠㅠ..
- 미해결타입스크립트의 모든 것
constructor질문
constructor 매개변수에 접근제한자와 타입과 옵셔널체이닝을 사용하는 문법에경우에는 if문을 걸었음에도 pw 값이 undefined가 나오는데 혹시 저런경우에 undefined 값을 막는 방법이 따로있나요??
- 해결됨타입스크립트의 모든 것
타입 단언과 관련해서 질문드립니다.
강의를 다 보고 나서 의문점이 들어서 질문 드립니다.강의에서 value 값을 출력하기 위해서인터페이스를 만들고 as랑 제네릭을 활용하는 법을 알려주셨는데제 생각에는 인터페이스를 만들었으니까example의 타입으로 인터페이스를 주면 되지 않을까 했습니다.해봤더니 에러가 안 나고 출력도 잘 되더라고요저한테는 인터페이스를 타입으로 주는 것이 더 간편하게 느껴지는데object를 타입으로 주는 것이 더 실무에 적합한 방식인 건가요?어떤 차이점이 있을까요? 그리고 제네릭을 식별자 뒤에 쓰면 인수와 관련된 것 같은데식별자 앞에 제네릭을 쓰면 어떤 의미인가요?
- 미해결타입스크립트의 모든 것
extends와 implements질문 드립니다.
extends의경우 클래스와 클래스간의 상속간에 사용되는것 아닌가요?? 그래서 인터페이스는 implements를 사용하는 것으로 알고있는데 extends를 사용해도 되나요??
- 해결됨타입스크립트의 모든 것
질문 드립니다.
keyof 강의를 듣다가 생긴 에러인데요prt 함수에서 key의 타입을 string으로 주면 저렇게 에러가 뜨는데이유를 봐도 이해가 잘 가지 않아서 질문드립니다.혹시 단순히 string으로 타입을 주면 params의 프로퍼티 키인지 타입스크립트가 알 수 없어서에러가 뜨는 것인가요?
- 미해결타입스크립트의 모든 것
as와 변수의 타입 지정 차이
안녕하세요. 단언하는 방법중에 제네릭보다 as를 더 많이 사용 하신다고 하셧는데 그러면 말씀하신 as로 하는것과 변수로 타입을 지정해서 사용하는것의 차이가 있을까요??interface IExam { value: number } const example: object = { value: 1 }; // 1. as console.log((example as IExam).value); // 2. 변수의 타입지정 interface IExam2 { value: number } const example2: IExam2 = { value: 1 }; console.log(example2.value)--방금 보충 봤습니다. 그런데 변수의 값에 as를 쓰면서 콘솔값에도 as를 쓰는 이유는 무엇인가요??
- 미해결타입스크립트의 모든 것
undefined형식 에러
undefined를 변수로 받지를 못합니다. 왜그런걸까요..??
- 미해결타입스크립트의 모든 것
질문드립니다.
클래스 - readonly 와 생성자이 수업에서 타임라인 28초쯤부터 ~ 1분 13초쯤까지 어떨 때는 정보를 보낼 때 class를 쓰고 어떨 때는 json과 object를 쓴다고 예를 들어주시는 내용 같은데..말이 좀 엉켜서 제가 이해가 잘 안되네요 😥다시 한번 설명 좀 부탁드려도 될까요?
- 해결됨타입스크립트의 모든 것
리터럴 타입 질문드립니다.
질문 1. enum categoryEnum { H = 'H', K = 'K', S = 'S', } const category: categoryEnum = categoryEnum.S; // 웹 앱 // ---기준선 // 서버 function cate(category: any) { console.log(category); if (category === 'H') { console.log('5% 할인'); } else if (category === 'K') { console.log('10% 할인'); } else if (category === 'S') { console.log('80% 할인'); } else { console.log('서버 멈춤'); } } cate(category);코드 중간에// 웹 앱// ---기준선// 서버이렇게 써주신 건 기준선 위로는 프론트엔드 쪽 코드고, 기준선 아래는 서버 쪽 코드라고 예를 들어주신 거라고 이해하면 될까요? 질문 2.그리고 강의 중에는 리터럴 타입을const sex: 'MALE' | 'FEMALE' | 'ETC' = 'MALE';이렇게 예를 들어 주셨는데깃 저장소 보니까type Hi = 'MALE' | 'FEMALE' | 'ETC'; const sex: Hi = 'MALE';이렇게 되어있더라고요 두 방법 모두 사용 가능한 건가요? -> 이 질문은 뒤 부분 강의 보고 이해했습니다. 질문 3.function sendError(): never { throw { errorCode: 500, message: 'internal server error' }; } const result = sendError(); console.log('result :', result);에러 처리할 때 never를 써주는 거랑 void를 써주는 거랑 결과는 똑같은데 무슨 차이가 있는 건지 이해가 잘 안 갑니다