묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결타입스크립트의 모든 것
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
-
미해결따라하며 배우는 데노(DENO) - 기본 강의
deno 발음
디노(dee-no) 가 맞습니다. 공식 메뉴얼에 나와있습니다.https://deno.land/manual@v1.36.0/introduction
-
미해결타입스크립트의 모든 것
안녕하세요 정말 좋은 강의 감사합니다
안녕하세요 정말 좋은 강의 감사합니다.혹시 vscode extension은 어떤거 쓰시는지 알수있을까요..?
-
미해결타입스크립트의 모든 것
!과 타입 단언 (보충) 질문
이런식으로 변수에 값을 할당하면서 동시에 사용할수 있다고 하셨는데examples2 type을 object 선언후 as 로 IExam 을 감싸는 이유가 따로 있을까요저렇게 했을경우 value 프로퍼티 접근을할경우 빨간줄이 뜨는데 이럴땐 해결하는 방법이 따로 있을까요??
-
해결됨타입스크립트의 모든 것
화살표 함수에서 this
안녕하세요 :)좋은 강의 제공해주셔서 감사합니다. 덕분에 타입스크립트에 대해 많이 알아가고 있어요.이전 강의와는 달리 화살표 함수를 통해 클래스를 함수로 변환하셨는데 그 과정에서 궁금한 점이 있습니다.화살표 함수에서 this는 상위 컨텍스트의 this(영상 속 add 함수의 경우 전역 객체인 global)를 가리키므로, 작성해주신 add 함수에서의 _this는 IAdd가 아닌 globalThis가 맞는 게 아닌지 의문이 들어 질문드립니다. 제가 모르는 거나 놓치는 게 있어서 이해를 못 하는 것 같은데 알려주시면 감사하겠습니다 ㅠㅠ..
-
해결됨타입스크립트의 모든 것
타입 단언과 관련해서 질문드립니다.
강의를 다 보고 나서 의문점이 들어서 질문 드립니다.강의에서 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를 변수로 받지를 못합니다. 왜그런걸까요..??
-
미해결타입스크립트의 모든 것
코딩 초보
안녕하세요. 강의 잘 봤습니다! 강의 내용 관련된 질문은 아니지만..답답해서요ㅜㅠ 저는 코딩 공부를 시작한 지 2개월정도 된 완전 코린이입니다..! 원래 처음엔 이해가 안되고 어려운 게 맞겠죠..?ㅠ코딩하면서 에러 뜰때마다 원인도 모르겠어서 몇시간 붙잡고 있던 적도 많고 개념 이해하기도 어려운데 ...지식공유자님은 처음에 어떤식으로 공부하셨는지 궁금합니다!! ㅠ
-
미해결타입스크립트의 모든 것
service계층과 데이터베이스 요청 주고받을 때 Builder패턴 질문
강사님 좋은 강의 고맙습니다 스프링에서 빌더패턴을 써봤는데 네스트에서도 빌더패턴을 적용하는 방법을 알게 됐네요강의 마지막 부분에서 service단에서도 DB와 통신할 때 빌더패턴을 이용할 수 있다고 말씀하셨는데 강사님께서 빌더를 적용하는 방법을 알고 싶습니다!추가적으로 강의가 너무 만족스러워서 새로운 강의가 계속 업데이트 되면 좋겠네요