묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨타입스크립트의 모든 것
데코레이터-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 }
-
미해결타입스크립트의 모든 것
색션 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은 어떤거 쓰시는지 알수있을까요..?
-
미해결타입스크립트의 모든 것
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와 통신할 때 빌더패턴을 이용할 수 있다고 말씀하셨는데 강사님께서 빌더를 적용하는 방법을 알고 싶습니다!추가적으로 강의가 너무 만족스러워서 새로운 강의가 계속 업데이트 되면 좋겠네요