Feathers: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ง€์›

์— ๋งŒ๋“  2016๋…„ 08์›” 07์ผ  ยท  103์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: feathersjs/feathers

__์ค‘์š”__: Feathers 4 ์ด์ƒ์—๋Š” TypeScript ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

http://docs.feathersjs.com/frameworks/angular2.html
์ด์ œ ๋ฐ๋ชจ๋Š”

const feathers = require('feathers/client');
const socketio = require('feathers-socketio/client');
const io = require('socket.io-client');
const localstorage = require('feathers-localstorage');
const hooks = require('feathers-hooks');
const rest = require('feathers-rest/client');
const authentication = require('feathers-authentication/client');

import ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด TypeScript ์ •์˜๋ฅผ ์ง€์›ํ•˜์„ธ์š”!

TypeScript

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ •์˜๊ฐ€ ์žˆ๋Š” ํฌํฌ:

๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์ผ์ด ์žˆ์—ˆ์ง€๋งŒ ๊นƒํ„ธ๊ณผ ํ™œ์ž์ฒด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  103 ๋Œ“๊ธ€

์•„, ๋ฐฉ๊ธˆ https://github.com/feathersjs/feathers/issues/64๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ ์ด๊ฑธ ์—ด์–ด๋‘˜๊นŒ์š”? ๊ทธ๋ž˜์„œ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ๋„์›€์„ ์ œ๊ณตํ•  ๊ฒƒ์ธ๊ฐ€?

์ด๊ฒƒ์„ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ Typescript ์ •์˜๋กœ ์ €์žฅ์†Œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(#64์—์„œ ์‹œ์ž‘ ์œ„์น˜์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํฌ์ธํ„ฐ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค).
๊ฑฐ๊ธฐ์— ํ† ๋ก .

์ด ๋ฌธ์ œ๋ฅผ ํ•œ๋‘ ๋‹ฌ ๋” ์—ด์–ด ๋‘˜ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ 1๋…„ ๋™์•ˆ ์•„๋ฌด๋„ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๊ฒฐ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ํ˜„์žฌ ํ•ต์‹ฌ ํŒ€์€ Typescript ๋˜๋Š” Angular๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์˜ ๋ ˆ์ด๋”์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค).

@harangue ๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ •์˜๋ฅผ ์ž‘์—…

ํ™•์‹คํ•œ! ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„์† ์ง„ํ–‰ํ•˜์„ธ์š”.

typescript๊ฐ€ ์ง€์›๋˜๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋„์™€๋“œ๋ฆด๊นŒ์š”?

@rollymaduk ๋‚˜๋Š” Feathers์— ๋Œ€ํ•œ ์ •์˜์— ๋Œ€ํ•ด ์ƒ๋‹นํ•œ ์ง„์ „์„ ์ด๋ฃจ์—ˆ์ง€๋งŒ ์•„์ง ์ด๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ํ™•๋ฆฝํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ณง ์ถœ์‹œ๋  TypeScript 2์—์„œ๋Š” ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ๊ณผ๋„๊ธฐ์ ์ž…๋‹ˆ๋‹ค). ๊ทธ๋•Œ๊นŒ์ง€ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ž‘์—… ์ด ์žˆ์œผ๋ฉด ๋‚ด๊ฐ€ ์ž‘์—…ํ•œ

@harangue ์ •๋ง ๋ฉ‹์ง„ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ์ผ๋ถ€ ์˜์—ญ์€ ์ธ์ฆ, ์ œ๊ณต์ž(rest,socke.io,primus) ๋ฐ ์ผ๋ถ€ db ์–ด๋Œ‘ํ„ฐ์™€ ๊ฐ™์€ ์ผ๋ถ€ ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์„ ๋ฐฐํฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์•„์ง ๋…ผ์˜ํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ, ์œ ์ง€ํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์‚ฌ๋žŒ์ด ์žˆ๋Š” ํ•œ ๊ธฐ๋ณธ ์ €์žฅ์†Œ์— Typescript ์ •์˜๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ค€๋น„๊ฐ€ ๋˜๋ฉด Feathers 2.1 ๋ฆด๋ฆฌ์Šค์˜ ์ผ๋ถ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์„œ๋น„์Šค์˜ ์ฝœ๋ฐฑ์ด v3์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ ๋ฐฐ์†ก๋  ์ˆ˜๋„ ์žˆ์Œ).

TypeScript์— generator-feathers ํฌํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐœ์ „๊ธฐ์˜ TS ํฌํฌ ์ž‘์—…์— ๊ด€์‹ฌ์ด ์žˆ์œผ์‹ญ๋‹ˆ๊นŒ?

ํŽธ์ง‘: ์ƒ์„ฑ๊ธฐ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ์ปค๋ฐ‹์„ ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ @harangue ๋Š” ์ด๋ฏธ https://gist.github.com/harangue/9d4ed79118e2656f5e3d2d699296ed36 ์— ์žˆ๋Š” Feathers Typescript ์ •์˜์˜ ๋Œ€๊ทœ๋ชจ ์„ธํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ๊ฒ€ํ† ํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜์—ฌ TypeScript ์ •์˜ ์ €์žฅ์†Œ์— ์ œ์ถœํ•  ์‚ฌ๋žŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ฌํ•ด๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— ์ƒ๋ฅ™ํ•  Auk ๋ฆด๋ฆฌ์Šค์˜ ์ด ๋ถ€๋ถ„์„ ๋งŒ๋“ค ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ์•„๋ฌด๋„ ๋‚˜์„œ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ์˜์›ํžˆ ๋‹ซํž ๊ฒƒ์ด๊ณ  ๊ณต์‹์ ์ธ TypeScript ์ง€์›์ด๋‚˜ ์ „์ฒด์— ๋Œ€ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์™ธ์— ์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋…ผ์˜๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ’ˆ์งˆ์ด ์ข‹์€ ๊ฒฝ์šฐ Feathers์™€ ํ•จ๊ป˜ ์ •์˜๋ฅผ ๋ฌถ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ณด์กฐ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

npm i @types/feathers ๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. typings ๊ฒƒ์€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/DefinitelyTyped/DefinitelyTyped์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค

ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋œ FAQ์—์„œ:

types-2.0 ๋ถ„๊ธฐ๋Š” types-publisher ๋•๋ถ„์— NPM์˜ @types ๋ฒ”์œ„์— ์ž๋™์œผ๋กœ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ณ‘ํ•ฉ๋œ ํ›„ 1์‹œ๊ฐ„ ์ด๋‚ด์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ชฐ๋ž์–ด์š”. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์„ ํ™•์‹คํžˆ Typed์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„, JS. ํ•œ ๋‘ ๋‹ฌ ์ •๋„ ์‰ฌ๊ณ  ์ƒํƒœ๊ณ„๊ฐ€ ์ง„ํ™”ํ•ฉ๋‹ˆ๋‹ค :์Šค๋งˆ์ผ:

๋„ˆ๋ฌด ์˜ค๋žซ๋™์•ˆ ๋‚ด ์ชฝ์—์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ผ๋””์˜ค ์นจ๋ฌต์ด ์žˆ์—ˆ๋˜ ๊ฒƒ์„ ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋Š˜ ์ด์ „ ํƒ€์ดํ•‘์— ์žˆ์—ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์š”์ ์˜ ๋˜ ๋‹ค๋ฅธ ๊ฐœ์ •ํŒ ์„

์š”์ง€์— ์กด์žฌํ•˜๋Š” ์ •์˜๋Š” 1) ํƒ€์ดํ•‘ ํ…Œ์ŠคํŠธ(Fathers ๋ฌธ์„œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•จ) ๋ฐ 2) JS Doc ์ฃผ์„(intellisense์—๋Š” ์ข‹์ง€๋งŒ ํ•„์ˆ˜๋Š” ์•„๋‹˜).

๊ธฐ์ˆ ์ ์œผ๋กœ ํ›„ํฌ ํƒ€์ดํ•‘์€ ํŽ˜๋” ํ›„ํฌ๋กœ๋„ ์ถ”์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ uberproto ์—๋Š” ์ •์  ์œ ํ˜•์œผ๋กœ ๋ณต์ œํ•˜๊ธฐ ์•ฝ๊ฐ„ ์–ด๋ ค์šด ๋ฏน์Šค์ธ ํŒจํ„ด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ํƒ€์ดํ•‘์„ ํ™•์žฅํ•˜๋ฉด ์•ฝ๊ฐ„ ์ง€์ €๋ถ„ํ•ด์ง‘๋‹ˆ๋‹ค.

@harangue๋‹˜ ๋‹ค์‹œ ๋ต™๊ฒŒ ๋˜์–ด ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๋ฅผ ์ฝ”์–ด์˜ ์ผ๋ถ€๋กœ ๋งŒ๋“ค ๊ณ„ํš์ด๋ฏ€๋กœ ์ง€๊ธˆ์€ ์—ฌ๊ธฐ์— ํ›„ํฌ ์œ ํ˜•์„ ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(#408 ์ฐธ์กฐ). ๋˜ํ•œ ํƒ€์ดํ•‘์€ https://blog.feathersjs.com/feathers-application-and-error-hooks-7a5982e70024์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์ƒˆ๋กœ์šด .hooks ๋ฐฉ๋ฒ•์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์•„์ง ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ž‘์—… ์ค‘ :).

@harangue ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์œ ํ˜•์„ ํ™•์‹คํžˆ ํƒ€์ดํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์ œ ์ œ์ถœํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, TypeScript defs๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ์ •๋ง ๋ฉ‹์ง‘๋‹ˆ๋‹ค. @harangue , feathers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ผ์น˜ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์œผ๋ฏ€๋กœ import ... from 'feathers' ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @subvertallchris , ๋‹น์‹ ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

import * as feathers from 'feathers';`

๋˜๋Š”

import feathers = require('feathers');

๊ทธ๋“ค์€ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค. :) Feathers์— ๋Œ€ํ•œ ์‹œ๊ฐ„์ด ๋‹ค์‹œ ์ƒ๊ฒผ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ์ผ์— ํœ˜๋ง๋ ธ์ง€๋งŒ ์ƒˆํ•ด๊นŒ์ง€๋Š” ์ด๋Ÿฌํ•œ ์ •์˜๊ฐ€ ์™„์ „ํžˆ ๊ตฌ์ฒดํ™”๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@j2L4e TS ์ƒ์„ฑ๊ธฐ ํฌํฌ๊ฐ€ 404'์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  @harangue ์ž˜ ์ง€๋‚ด๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ๋‚˜๋Š” ์ด ๋•…์„ ๋ณด๊ณ  ์‹ถ์–ด ํ•˜๋ฉฐ TS ์ •์˜ ํŒŒ์ผ, feathers generate --ts ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ํฌํฌ๋กœ cli๊ฐ€ typescript๋‚˜ ๋ฌธ์„œ์™€ ์ž˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค ์ค˜์š”.

์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์› ๊ณ  mysql ๋ฐ ๋กœ์ปฌ ์ธ์ฆ์— ๋Œ€ํ•ด์„œ๋งŒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์œผ๋ฉฐ generator-feathers๋Š” ์–ด์จŒ๋“  ๊ณง ํ๊ธฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์Šคํฌ๋žฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด cli์˜ ์ถœ์‹œ๋ฅผ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค์ „ 19. 2016๋…„ 12์›” 14:41:42 MEZ, schrieb georgeedwards [email protected] :

@j2L4e TS ์ƒ์„ฑ๊ธฐ ํฌํฌ๊ฐ€ 404'์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?
๊ทธ๋ฆฌ๊ณ  @harangue ์ž˜ ์ง€๋‚ด๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ๋‚˜๋Š” ์ด๊ฒƒ์„๋ณด๊ณ  ์ •๋ง๋กœ ์—ด๋งํ•œ๋‹ค.
ํ† ์ง€ ๋ฐ TS ์ •์˜ ํŒŒ์ผ์˜ ๊ตฌํ˜„์„ ์ง€์›ํ•˜๊ฒŒ ๋œ ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
feathers generate --ts ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ํฌํฌ๋กœ cli๋ฅผ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒ€์ดํ”„ ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ฌธ์„œ. ์•Œ๋ ค ์ค˜์š”.

--
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/feathersjs/feathers/issues/381#issuecomment -267966376

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•„์ง ์ž‘์—… ์ค‘์ธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ํ”„๋กœ์ ํŠธ๋ฅผ Typescript์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์•ˆ๋…•ํ•˜์„ธ์š”

_๊ฑฐ์˜ ๋‹ค ๋˜์—ˆ์Šต๋‹ˆ๋‹ค._ ๐Ÿ˜„
FeatherjsOrg์—์„œ ๋งŽ์€ ํฌํฌ๋ฅผ ๋งŒ๋“ค๊ณ  repo๋ณ„๋กœ ์ •์˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ณ ์˜ typescript ์ •์˜์™€ ํ•จ๊ป˜ feathersjs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ƒ˜ํ”Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Feathers+Nodejs+Typescript
FeathersClient+Aurelia+Typescript

[์˜ˆ, ํด๋ผ์ด์–ธํŠธ ์ฒญํฌ์— ๋Œ€ํ•œ ESNext, Commonjs, AMD ๋ฐ ๊ธ€๋กœ๋ฒŒ ๋ชจ๋“ˆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.]

aurelia ์ƒ˜ํ”Œ์€ angular2๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹จ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋Š” typescript๊ฐ€ ๋ผ์ด๋ธŒ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋งŽ์€ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณง PR์„ ํ•˜๊ฒ ์ง€๋งŒ, ๋ณด๊ณ , ์งˆ๋ฌธํ•˜๊ณ , ํ”ผ๋“œ๋ฐฑ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘Œ?

์ •์˜๊ฐ€ ์žˆ๋Š” ํฌํฌ:

๋‚˜๋Š” ์•ฝ๊ฐ„์˜ ์ผ์ด ์žˆ์—ˆ์ง€๋งŒ ๊นƒํ„ธ๊ณผ ํ™œ์ž์ฒด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ์ƒ๋Œ€์  ๋งํฌ์ž…๋‹ˆ๋‹ค

๋งํฌ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@AbraaoAlves ๋ฉ‹์ง€๋„ค์š” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์Œ๋ž€ํ•œ ๋Œ“๊ธ€์„ ์“ฐ๊ณ  ์ด์Šˆ๋ฅผ ๋‹ซ์œผ๋ ค๋˜ ์ฐธ์ด์—ˆ๋Š”๋ฐ ๋จผ์ € ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์…”์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค ๐Ÿ˜‰ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค!

์ข‹์€ ์‚ฌ๋žŒ @AbraaoAlves !

@AbraaoAlves ์ •๋ง ๊ฐ์‚ฌํ•˜๋‹ค๋Š” ๋ง์„ ์ „ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ €์—๊ฒŒ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค! ๋‹น์‹ ์ด ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„์— ์™”๋‹ค๋Š” ๊ฒŒ ๋ฏฟ๊ธฐ์ง€ ์•Š์•„์š”

@AbraaoAlves ๊ท€ํ•˜์˜ ์ •์˜๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ package.json์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ

"feathers-errors": "^2.5.0",

"feathers-authentication": "^0.7.12",

"feathers-configuration": "^0.3.3",

"feathers": "https://[email protected]/AbraaoAlves/feathers.git#definition",

"feathers-hooks": "git://github.com/AbraaoAlves/feathers-hooks.git#definition",

"feathers-mongoose": "^3.6.2",

"feathers-rest": "git://github.com/AbraaoAlves/feathers-rest.git#definition",

"feathers-socketio": "git://github.com/AbraaoAlves/feathers-socketio.git#definition"`

๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ TypeScript ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ:

import * as feathers from "feathers"

์ปดํŒŒ์ผ์„ ํ†ต๊ณผํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ์ •์˜๋งŒ ์„ค์น˜ํ•˜๊ณ  ์†Œ์Šค๋Š” ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ feathers-rest๋Š” typescript๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
rest()' as a valid command for app.use(rest());

๋˜ํ•œ ํ•œ ๊ฐ€์ง€ ๋” ๋ฌธ์ œ๋Š” app.use๊ฐ€ ๋” ์ด์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
this.app.use(bodyParser.json());

๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

this.app.use(bodyParser.json() as any);

@Chrisdf ๋‚˜๋Š” package.json์˜ tgz ํŒŒ์ผ๋กœ ์ด๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ณ  ์ง€๊ธˆ ๋ณต์ œํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ: ๋ฌธ์ œ

@AbraaoAlves ๊ฐ€ @types ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ต์‹ฌ ํŒ€์ด ๋ฆด๋ฆฌ์Šค์˜ ์ผ๋ถ€๋กœ ์ •์˜๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

@AbraaoAlves ๊ทธ๋Ÿฐ๋ฐ ์ •์˜๊ฐ€ ์ปค๋ฐ‹๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹  tarball ๋ฆด๋ฆฌ์Šค๋กœ ๊ฒŒ์‹œ ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋Ÿฐ ์‹์œผ๋กœ typings ๋” ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋Ÿฌํ•œ ๋…ธ๋ ฅ์— ๋งค์šฐ ๊ฐ์‚ฌํ•˜๋ฉฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ •์˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์œ ์ตํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ Typed๋Š” ์ข‹์€ ์กฐ์น˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@AbraaoAlves ์™€ @harangue์˜ ์ž‘์—…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ€์ดํ•‘์„ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณง ์ด ํƒ€์ดํ•‘์„ ํ™•์‹คํžˆ Typed์— ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹œ์›ํ•œ. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”/ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๋‹จ ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ €์žฅ์†Œ์™€ package.json์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
(์ ์–ด๋„ ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝ์šฐ)

์˜ˆ: package.json ํฌํ•จ ํŒŒ์ผ

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„/
์ธ๋‚ด์‹ฌ๊ณผ ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@stevehipwell ๋ฐ @daffl : ๋‚˜๋Š” typescript ์ •์˜ ํŒŒ์ผ์ด ๋ฌธ์„œ, ๋ผ์ด๋ธŒ ๋ฌธ์„œ์™€

๋‚˜๋Š” @types ์™€ ์žˆ์œผ๋ฉฐ , ์ด๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‚ฌ๋žŒ๋“ค์ด ์ •์˜์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š” ์ œ ์‹œ๊ฐ„์— typescript ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚ , ๋‹จ์ผ ๋ฆด๋ฆฌ์Šค์—์„œ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ†ต์‹  ์˜ค๋ฅ˜ ๋ฐœ์ƒ๋ฅ ์ด ํ›จ์”ฌ ๋‚ฎ์•„์ง€๊ณ  ๋ฆด๋ฆฌ์Šค๋ณ„๋กœ ๊ณต๋ฌด์› ์ •์˜๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค!

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ์˜ ์˜ˆ๋Š” ๊ณ ์œ ํ•œ ์ •์˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค: Aurelia , Preact , ...

๋ชจ๋‘๊ฐ€ ๋™์˜ํ•˜๋Š” ๊ฒฝ์šฐ PullRequest ๋งํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ํ…Œ์ŠคํŠธ, ์ž๋™ํ™”์™€ ๊ฐ™์€ ๋” ๋งŽ์€ ์ž‘์—…์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์‹œ์ž‘์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

Typescript S2 FeathersJS!

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

๋‚˜๋Š” ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜์ด ํŒจํ‚ค์ง€์— TypeScript ์ •์˜ ํŒŒ์ผ์„ ์ง์ ‘ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” @AbraaoAlves์˜ ๋ง์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํฌํ•จ๋œ ์ •์˜ ํŒŒ์ผ์ด ๊ตฌ์‹์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ DefinitlyTyped๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ฒƒ์„ ๋” ์ž‘๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” Node ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๋Š” ์ค‘๊ฐ„ ์†”๋ฃจ์…˜์œผ๋กœ ์ •์˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๊ณ  ์ œ์•ˆํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ •์˜๊ฐ€ ํ”„๋กœ์ ํŠธ ๋ฆด๋ฆฌ์Šค์™€ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋„๋ก ํ•˜๋ ค๋ฉด ํŽ˜๋” ํŒ€์˜ ๋” ๋‚˜์€ ํˆฌ๋ช…์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด ์ž์‹ ์˜ ์ •์˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๋ฆด๋ฆฌ์Šค์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ๊ฐ€ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€๋˜์ง€ ์•Š๊ณ  ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ ์ด๋ฆ„(v3, auk, buzzard??)์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@AbraaoAlves - ์ •์˜๊ฐ€ ์ข‹์•„ ๋ณด์ด์ง€๋งŒ hooks() ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์ด ๋ˆ„๋ฝ๋œ ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์œผ์‹ญ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @stevehipwell

ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ๋‚ด ๋Œ€๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํฌํ•จ๋œ ์ •์˜ ํŒŒ์ผ์ด ๊ฒฐ๊ตญ ๊ตฌ์‹์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค...
์ •์˜๊ฐ€ ํ”„๋กœ์ ํŠธ ๋ฆด๋ฆฌ์Šค์™€ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋„๋ก ํ•˜๋ ค๋ฉด ํŽ˜๋” ํŒ€์˜ ๋” ๋‚˜์€ ํˆฌ๋ช…์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋™๊ธฐํ™” ๋ฌธ์ œ๋Š” ์‹ค์ œ ๋ฌธ์ œ์ด์ง€๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” typescript์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค: #508

์ด ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋™์˜ํ•˜๊ฑฐ๋‚˜ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ฑฐ๊ธฐ์— ์˜๊ฒฌ์„ ์ œ์‹œํ•˜์‹ญ์‹œ์˜ค.

์ €๋Š” ํ™•์‹คํžˆ feathersjs๋ฅผ ํŒŒ๊ดด์ ์ธ ๋ณ€๊ฒฝ ์—†์ด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๋™๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
hooks() ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์ด ํ•ด์•ผ ํ•  ์ผ์ด ํ›จ์”ฌ ๋” ๋งŽ์ง€๋งŒ ์ด์ œ ํ•จ๊ป˜ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ๋ฅผ ๋ณด๊ฑฐ๋‚˜ ์ •์˜๋ฅผ ๋†“์น˜๋ฉด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜์‹ญ์‹œ์˜ค.

@AbraaoAlves ์ •์˜๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ ค๋Š” ์š•๊ตฌ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด ์ •์˜ ๋ˆ„๋ฝ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ์ €์žฅ์†Œ์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@stevehipwell ์˜ˆ, ์š”์ ์ž…๋‹ˆ๋‹ค.

์ถœ์‹œ ์ผ์ •์˜ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ด๋ฉฐ ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์˜ ์ด์ •ํ‘œ ๋Š” ์—ฌ์ „ํžˆ ๋Œ€๋žต์ ์ธ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋Š” ์ƒ์„ฑ๊ธฐ๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ๋ฌธ์„œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์™„์ „ํ•œ ์ฝ”๋“œ์ธ Auk ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ feather-authentication v1.0.0์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ดํ›„ ๋ฆด๋ฆฌ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ต์‹ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํ•จํ•˜๋Š” Buzzard ์ž…๋‹ˆ๋‹ค(์‚ฌ์‹ค ๋•Œ๋•Œ๋กœ v3์œผ๋กœ ์ฐธ์กฐ - ์•„๋งˆ๋„ ๐Ÿ˜‰๋Š” ์•ˆ ๋จ):

ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ถœ์‹œ๋˜๋ฉด ์ •์˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Typescript ์ •์˜๋Š” C++์˜ .h(ํ—ค๋”)์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์— ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ํ—ค๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋œ ์ฝ”๋“œ ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์„œ์™€ ๊ฐ™์ด ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ API ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฐ ๋งˆ์ผ์Šคํ†ค์—๋Š” ์ •์˜๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ƒˆ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ...

์ €๋Š” ํŽ˜๋” ์ธ์ฆ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  v1์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ›„ํฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
์ด์ œ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. FeathersJS์˜ ํ˜„์žฌ ๋ฒ„์ „์— ์ •์˜๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@AbraaoAlves ์ €๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ชจ๋“  PR์— ๋Œ€ํ•ด ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์—ฌ์ „ํžˆ ๊ถ๊ธˆํ•ดํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ #508์ด์ง€๋งŒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์ž…๋ ฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.

socketio๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

node_modules/feathers-socketio/index"' resolves to a non-module entity and cannot be imported using this construct.

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์˜ feathers-cli๊ฐ€ ์ธ์ˆ˜ ์—†์ด ์ถœ๋ ฅํ•˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€๋Š” ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

.configure(rest()) // ์˜ค๋ฅ˜ ์„ ์–ธ function rest(handler:Function): Function;
.configure(์†Œ์ผ“ํ‹ฐ์˜ค())

๋…ธ๋“œ -v
v6.6.0

npm -v
3.10.5

tsc -v
2.1.6

์ด๊ฒƒ์ด ์ง„์ž…์ ์ด๊ธฐ ๋•Œ๋ฌธ์— "feathers()"๋ฅผ ๋ชจ๋“ˆ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ๋„ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ์„œ๋น„์Šค/๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์„ฑ์ž() {}์—์„œ feathers()๋ฅผ ์บก์Šํ™”ํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ๊นƒํ„ธ์ด ์ฒ˜์Œ์ด๋ผ ์ž˜๋ชปํ•˜๊ณ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ...)

ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค๋กœ ์ •์˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ์ˆ˜์ค€์˜ ๋ณ€๊ฒฝ์€ ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋˜๋Š” ์ž˜๋ชป๋œ ์ž…๋ ฅ์ด๋ผ๋„ ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค๊ฐ€ ๋‚˜์˜ค๋ฉด ์ฆ๊ฐ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ดํ•‘์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์‹œ์ž‘์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ณ„์† ์ •์ฒด๋˜๊ณ  ๋‚ด ์ •์˜์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋œ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ €์žฅ์†Œ์˜ ์ •์˜๋ฅผ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฝ๋‹ˆ๋‹ค.

#508์—์„œ @AbraaoAlves ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด Slack ์—์„œ ์ข‹์€ ์‹œ๊ฐ„์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(minor.pre๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ)?

๋จผ์ € ์ด ํ† ๋ก ์— ์ฐธ์—ฌํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค, ํŠนํžˆ ์ˆ˜๊ณ ํ•ด ์ฃผ์‹  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋งŽ์€ Feathers ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•ด TypeScript ์ •์˜๊ฐ€ ํฌํ•จ๋œ ๋ถ€ ๋ฒ„์ „์„ ์ถœ์‹œํ–ˆ์ง€๋งŒ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒ๋‹นํžˆ ์•ˆ์ •์ ์ธ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์˜ˆ์ •๋˜์ง€ ์•Š์€ ๋ฆด๋ฆฌ์Šค๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๊ฐ€ TypeScript๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์—…๋ฐ์ดํŠธ๋„ ์ฝ”์–ด์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ• ์—†์ด ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํŒ€(์•„๋ฌด๋„ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ณณ)์—์„œ ๋ฌธ์ œ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Feathers + TypeScript์— ๋Œ€ํ•œ ์ „์ฒด ํ† ๋ก ์—์„œ ๋‚ด๊ฐ€ ์–ป์€ ์ฃผ์š” ๋‚ด์šฉ์€ ๊ธฐ์กด JavaScript ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํƒ€์ดํ•‘์„ ๋งŒ๋“ค๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ํŒ€์€ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์š” API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆด๋ฆฌ์Šคํ•  ๋•Œ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ์œ ์ผํ•œ ์„ ํƒ์€ ์˜ค๋ž˜๋œ TypeScript ์ •์˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ TypeScript ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— Feathers ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ตœ์‹  TypeScript ์ •์˜๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ด๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œํ•œ๋œ ์‹œ๊ฐ„์œผ๋กœ ์šฐ๋ฆฌ ์ž์‹ ์˜ ์ €์žฅ์†Œ์—์„œ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜๊ณ  ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ƒํ˜ธ ์šด์šฉ์„ฑ TypeScript ์ฃผ์žฅ์— ๋Œ€ํ•ด ์ž˜ ๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Feathers๋Š” ํŠน์ • ์ž…๋ ฅ ์—†์ด ์™„๋ฒฝํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Intellisense ๋ฐ ์œ ํ˜• ์—†์ด๋Š” ๊ทธ๋ƒฅ ์ผ๋ฐ˜ JS์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฏน์Šค์ธ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” feathers ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์€ ํƒ€์ดํ•‘์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋งค์šฐ ๋น„ ํƒ€์ดํ•‘ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ์ž(๊ทธ๋ฆฌ๊ณ  ๊ทธ ํŒฌ)์ด์ง€๋งŒ, ์ง€๊ธˆ์€ ์„œ๋ฒ„์ธก ํŽ˜๋”๋ฅผ ์œ„ํ•ด ES6์œผ๋กœ ๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค.
์œ ํ˜•์„ ๋ณ„๋„๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ํŒ€์˜ ์•„๋ฌด๋„ ์—†๋Š” ์—ฌ๊ธฐ์—์„œ ๋” ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Feathers๋Š” TypeScript์™€ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋ฉด Angular์— ์„ ํ˜ธ๋˜๋Š” ์„œ๋ฒ„ ์ธก ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ' :-). ์ง€๊ธˆ์€ ๊ณ„์† ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

@j2L4e ํ˜„์žฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜ํ•ด ํ˜ผํ•ฉ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋“ค์ด ์ฝ”์–ด์˜ ์ผ๋ถ€๊ฐ€ ๋˜๋ฉด ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์ด๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋„์›€์„ ์•ˆ์ •์ ์œผ๋กœ ๋ฐ›๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@rjsteinert ํ˜„์žฌ ์žˆ๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ์ž‘๋™ํ•˜์ง€๋งŒ ์˜ˆ, ๋ชจ๋“  ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹œ๋„ํ•˜๊ณ  ๋„์›€์„ ์ฃผ๊ฑฐ๋‚˜ ๊ณ„์† ์ง„ํ–‰ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋„ํ•˜๊ณ  ๋„์›€์„ ์ฃผ๊ฑฐ๋‚˜ ๊ณ„์† ์ง„ํ–‰ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Angular๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ณ  ์˜ค๋žœ JS ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ, TS๊ฐ€ ์ธ์ƒ์„ ์–ผ๋งˆ๋‚˜ ์žฅ๋Œ€ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊นจ๋‹ซ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์„œ๋ฒ„ ์ธก์—์„œ ์—ญํ• ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํŒ€์ด ์š•์„ ํ•˜๊ณ  ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๋Š” ํ™˜์ƒ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž„์„ ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ๋งค์ผ. ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ์˜ต์…˜์ด ๋ถ€์กฑํ•˜์—ฌ ๊นƒํ„ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ํƒ€์ดํ•‘์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ™•์‹คํžˆ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€๋‚˜๊ฐ€๋ฉด์„œ " API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆด๋ฆฌ์Šคํ•  ๋•Œ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ์œ ์ผํ•œ ์„ ํƒ์€ ์˜ค๋ž˜๋œ TypeScript ์ •์˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ"์„ ๋ณผ ๋•Œ ๋‹ค๋ฅธ ๊ณณ์„ ๋ด…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๊ฐ€๋ณ๊ฒŒ ์—ฌ๊ธฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘๊ฐ€ ์žฌ์ž‘์„ฑ์„ ํ•˜๊ณ  ์žˆ๋Š” ์ œ ์ƒํ™ฉ์— ์žˆ๊ฒŒ ๋  ๋งŒํผ ์šด์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ €๋Š” ์šด์ด ์ข‹์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

@rjsteinert TypeScript๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์น˜๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? (์†”์งํ•œ ์งˆ๋ฌธ) ํ˜„์žฌ Feathers ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ TypeScript๋ฅผ ์ง์ ‘ ์‚ดํŽด๋ณด๊ธฐ์— ์ถฉ๋ถ„ํ•  ์ •๋„๋กœ ๊ด€์‹ฌ์ด ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ/CodeSense์— ๋„์›€์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Feathers API๋Š” ๋„ˆ๋ฌด ์ž‘์•„์„œ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ €์˜ ๋ฌด์ง€ํ•จ์„ ์šฉ์„œํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ;)

autocomplete/CodeSense ๋Š” ์ข‹์€ ๋ถ€์‚ฐ๋ฌผ์ด์ง€๋งŒ ์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Vim์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๊ฒƒ์„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ๋ณธ ํฐ ๋ณ€ํ™”๋Š” ๊ธฐ์—ฌํ•œ ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ‘œ์ค€ํ™”์ž…๋‹ˆ๋‹ค. NPM์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋™์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ์–ธ์–ด๊ฐ€ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž์ฒด ๊ฐœ๋ฐœํ•˜๊ณ  ์ฐฝ์˜์ ์ธ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. TS๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ง์ ‘ ์œ ํ˜•์„ ํ™•์ธํ•˜๋Š” ์ˆ˜๋งŽ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋” ์‰ฝ๊ฒŒ ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ๋‚ด ์Šคํƒ€์ผ์˜ ์ƒ์šฉ๊ตฌ JS๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ง€๊ฒน๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฉฐ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋ˆ„๊ตฐ๊ฐ€์˜ README๋ฅผ ์ฝ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rjsteinert ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” JavaScript๋กœ 15๋…„ ์ด์ƒ ์ผํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  API๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰ ์—†์ด ๋ฉ”๋ชจ์žฅ์œผ๋กœ ์ฝ”๋”ฉ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ „์ฒด ์‚ฌ์ดํŠธ๊ฐ€ JavaScript๋กœ๋งŒ ์ž‘์„ฑ๋œ Microsoft ํŒ€์—์„œ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์‚ฌ์ดํŠธ๊ฐ€ 50๋ช… ์ด์ƒ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์— ๋„๋‹ฌํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์—‰๋ง์ด ๋ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์ดํŠธ๋Š” ๋Ÿฐํƒ€์ž„์—๋งŒ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

์ด GitHub ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๊ณ  FeatherJS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์•„๋งˆ๋„ ์—ด๋ ฌํ•œ JavaScript ๊ฐœ๋ฐœ์ž์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. FeatherJS ๊ฐœ๋ฐœ์ž ์ค‘ ํ•œ ๋ช…์ด๋ฉด TypeScript๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๋„๊ตฌ๋‚˜ TypeScript ๋„์›€๋ง์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์œ ๋‹ˆ์ฝ˜์ž…๋‹ˆ๋‹ค.
์ €๋Š” TypeScript์— ๋Œ€ํ•ด ๊ทน๋„๋กœ ๋ฐ˜๋Œ€ํ–ˆ์ง€๋งŒ(ํŠนํžˆ Alpha 1.1 ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”๋ฐ›์•˜์Šต๋‹ˆ๋‹ค), ์ˆ˜๋…„ ๋™์•ˆ ์ €๋Š” TypeScript๋ฅผ ๊ฐ์‚ฌํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์› ๊ณ  TypeScript ์—†์ด๋Š” ์‚ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ๊ณผ ํ•จ๊ป˜ ์ผํ•˜๊ฒŒ ๋  ๋™๋ฃŒ๋“ค์€ ๋‹น์‹ ์ด JavaScript์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ชจ๋“  ๋‹ค๋ฅธ ๋ฐฐ๊ฒฝ์—์„œ ์˜ฌ ๊ฒƒ์ด๊ณ  JavaScript๊ฐ€ ์–ผ๋งˆ๋‚˜ ์“ฐ๋ ˆ๊ธฐ ๊ฐ™์€์ง€ ์ €์ฃผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TypeScript ์–ธ์–ด๋Š” ๊ทธ ์ดํ›„๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ๋ฐฑ์—์„œ ๋งŽ์ด ์„ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
๋„๊ตฌ์™€ ํฐ ํŒ€ ์—†์ด๋Š” ๋Œ€๊ทœ๋ชจ ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. @rjsteinert๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ํŒ€์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ž ์‹œ ํ›„ ์„œ๋ฒ„ ์ธก์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋งค์šฐ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํšŒ์‚ฌ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ธํ”„๋ผ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ ๋‹ค์Œ featherjs๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์›น์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด์ธ PHP, NodeJS, Ruby, C#, Java๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ์ผ๋ถ€๋Š” ์ž…๋ ฅ๋˜๊ณ  ์ผ๋ถ€๋Š” ์ž…๋ ฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด ๋ชจ๋“  ์–ธ์–ด๋กœ ์ž‘์—…ํ–ˆ์œผ๋ฉฐ ์ด ๋ชจ๋“  ์„ธ์›”์ด ์ง€๋‚œ ํ›„์— "๋Ÿฐํƒ€์ž„ ์ „์šฉ ๋ฐœ๊ฒฌ ์˜ค๋ฅ˜" ์–ธ์–ด๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ชจ๋‘ ์ž์‹ ์˜ ๋งค๋ ฅ, ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํฐ ํŒ€์—์„œ ๋‚˜๋Š” ํ•ญ์ƒ ์กฐ๊ธˆ ๋” ๊ฐ•ํ•˜๊ณ  ํƒ€์ดํ•‘ํ•œ ๊ฒƒ์„ ์ œ์•ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ PHP SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ์˜ˆ์ž…๋‹ˆ๋‹ค. 100์ž๋ฆฌ์˜ "ํฐ ์ˆซ์ž"๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ๋Š” ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž ๊ฐœ๋ฐœ์ž๋Š” setValue(123456789123...) ํ˜ธ์ถœ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ NodeJS ๋˜๋Š” substr ๋ฉ”์„œ๋“œ์—์„œ ๋งค์šฐ ๋‚ฎ๊ฒŒ ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์œ ๋ฅผ ๋ฌป๋Š” ๋ฒ„๊ทธ๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ด์ œ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•จ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผํ•  ๋•Œ ๊ฐ•์ œ๋กœ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ํŠน์ • ๋ฌธ์„œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ์—ด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด Angular2 + NodeJS ํ”„๋กœ์ ํŠธ์— ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์•ฝ๊ฐ„ ์กฐ์‚ฌํ–ˆ๋Š”๋ฐ FeatherJS๊ฐ€ ๋”ฑ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋Š˜ ๋‹ค๋ฅธ ์„œ๋ฒ„ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‚˜์™€ "๊ธฐ๋ณธ์ ์œผ๋กœ TypeScript๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋ฉด ๋ฐ”๋กœ ์ „ํ™˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์•„์ฃผ ์ข‹์€ ํ† ๋ก ์ด ์žˆ์—ˆ์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์˜ ์žฅ์ ์œผ๋กœ ๋ฐ”๋€Œ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ๋Š๋ผ๊ณ  ์žˆ๊ณ  ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ด ๋ฌธ์ œ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•ต์‹ฌ ํŒ€์€ Feathers ์ž‘์—…์— ํ•„์ˆ˜์ ์ด์ง€ ์•Š๊ณ  Feathers์˜ ํ•ต์‹ฌ์„ ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์†๋„๋ฅผ ์ค„์ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— Typescript ์ •์˜๋ฅผ ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถœ์‹œํ•  ๋•Œ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์ด๋ฏธ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฆด๋ฆฌ์Šค๋ฅผ ๋” ๋นจ๋ฆฌ ์ถœ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ข…์†์„ฑ์„ ์ค„์ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ Typescript ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ๋งŽ์€ ์ž‘์—…์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. Feathers ํ•ต์‹ฌ ํŒ€ ์ค‘ ๋ˆ„๊ตฌ๋„ Typescript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ •์˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ง€์‹์ด ์—†์Œ
  2. ์†Œ์ˆ˜์˜ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์ด ์ •์˜๋ฅผ "์š”๊ตฌ"ํ•  ๋•Œ ์ •์˜ ์ž‘์—…์— ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์œ„ํ•ด ์ž‘์—…ํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์‹ ์ •์˜๋ฅผ ์ƒ์„ฑ/์œ ์ง€ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ƒˆ ๋ฌธ์„œ์˜ ์—์ฝ”์‹œ์Šคํ…œ ์„น์…˜์— ๋งํฌํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Feathers๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ TS ์ •์˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ์ธ ์ทจํ–ฅ์— ๋” ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค์„ ์œ ์ง€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด ์ €์žฅ์†Œ ์—์„œ ๊ทธ๊ฒƒ๋“ค์„ https://github.com/feathersjs/feathers-typescript์— ๋„ฃ์„ ๊ฒƒ @jsgoupil , @rjsteinert , @AbraaoAlves ๋˜๋Š” ๊ด€์‹ฌ ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ €์žฅ์†Œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ

์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ† ๋ก ์„ ์œ„ํ•ด ์—ด์–ด๋‘๊ฒ ์ง€๋งŒ ํ•ต์‹ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์™ธ๋ถ€์—์„œ ์ •์˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๊ณผ ๋ฐ˜๋Œ€๋กœ Typescript์˜ ์žฅ์ ์„ ๋…ผ์˜ํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ธ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜„

์ด๊ฒƒ์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด npm์— ๊ฒŒ์‹œ๋œ ๋ฒ„์ „์— ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ณ  package.json ํ•ญ๋ชฉ์— jsnext:main ๋˜๋Š” module package.json ๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

TypeScript๋Š” ์ด์ œ ์™€์ผ๋“œ์นด๋“œ ๋ชจ๋“ˆ ์ •์˜๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ feathers-sub-modules์—์„œ ๋ชจ๋“  ํƒ€์ดํ•‘์„ ์ œ๊ฑฐํ•˜๊ณ  ์ด๋ฅผ feathers ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

declare module 'feathers';
declare module 'feathers-*';

๊นƒํ„ธ๊ณผ ๋ชจ๋“  ๊นƒํ„ธ์„ any ์œ ํ˜•์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ TS์—์„œ "์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค. ํ–ฅ์ƒ๋œ ์ธํ…”๋ฆฌ ์„ผ์Šค๋ฅผ ์–ป์ง€๋Š” ๋ชปํ•˜์ง€๋งŒ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ๋‚ด์šฉ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ž‘๋™ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์˜ ๋“ฑ์„ ๋Œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ํ•œ๋‹ค:

"paths": {
            "feathers-socketio": ["typedefs/feathers-socketio/index.d.ts"]

๋งŽ์€ ์ž‘์€ PR์„ ์—ด๊ณ  TS๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์‹ค์ œ๋กœ ์•„๋ฌด ๊ฒƒ๋„ ํŒจ์น˜ํ•˜์ง€ ์•Š๋Š” ๋งŽ์€ ํŒจ์น˜ ๋ฒ„์ „์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๊ทธ ๋™์•ˆ ๋ถ€์ •ํ™•ํ•˜๊ฑฐ๋‚˜ ๋ถˆ์™„์ „ํ•œ typedef๋ฅผ "์žฌ์ •์˜"ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•,
typescript ์ง€์›์— ๊ด€ํ•œ ํ•œ ๊ฐ€์ง€ ์˜๋ฌธ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
Service ์˜

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์„œ๋น„์Šค ๋ฐฉ๋ฒ•์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
๋ณด๋‹ค
image

๊ทธ๋Ÿผ ์„œ๋น„์Šค ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์•„์•ผ ํ•˜์ง€ ์•Š์„๊นŒ์š”?

  interface Service<T> extends events.EventEmitter {
    find?(params?: Params, callback?: any): Promise<T[] | Pagination<T>>;
    get?(id: number | string, params?: Params, callback?: any): Promise<T>;
    create?(data: T | T[], params?: Params, callback?: any): Promise<T | T[]>;
    update?(id: NullableId, data: T, params?: Params, callback?: any): Promise<T>;
    patch?(id: NullableId, data: any, params?: Params, callback?: any): Promise<T>;
    remove?(id: NullableId, params?: Params, callback?: any): Promise<T>;
    setup?(app?: Application, path?: string): void;
  }

@harish2704 ๋„ค ๋งž์•„์š”

๋‚˜๋Š” ํ˜„์žฌ "repo typedef ์žฌ์ •์˜" ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณ ์ˆ˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚˜๋ฉด ์–ธ์  ๊ฐ€(ํ—คํ—ค ์†๊ฐ€๋ฝ์ด ๊ต์ฐจ) feathers-typescript ๋˜๋Š” ํ™•์‹คํžˆTyped์— ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ”„๋กœ๋•์…˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ „ํˆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ์ •์˜๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋งˆ์›Œ ์ฟ !

2017๋…„ 5์›” 9์ผ ํ™”์š”์ผ ์˜ค์ „ 7์‹œ 42๋ถ„, Richard Michael Coo <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@harish2704 https://github.com/harish2704 ๋„ค ๋งž์Šต๋‹ˆ๋‹ค

์ง€๊ธˆ์€ "repo typedef ์žฌ์ •์˜" ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณ ์ˆ˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋งˆ๋„ ์–ธ์  ๊ฐ€ (ํ—คํ—ค ์†๊ฐ€๋ฝ์ด ๊ต์ฐจ) ๊นƒํ„ธ ํ™œ์ž ๋˜๋Š”
๋‚ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚˜๋ฉด ํ™•์‹คํžˆ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ „ํˆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ์ •์˜๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ƒ์‚ฐ ํ”„๋กœ์ ํŠธ.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/feathersjs/feathers/issues/381#issuecomment-300138396 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABezn0WGqH30NNp8-X-ckpVuk_BTQbbnks5r4FEQgaJpZM4Jears
.

@myknbani
์ฒดํฌ์ธํ•˜๊ธฐ์—๋Š” ์กฐ๊ธˆ ์ด๋ฅด์ง€๋งŒ typedef๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์…จ๋‚˜์š”? ์ „ํ˜€ ์†์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? :) ๋‚˜๋Š” ์ƒˆ ํ”„๋กœ์ ํŠธ์—์„œ ํŽ˜๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ TypeScript ์ง€์›์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„์˜ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค.

TypeScript ์ง€์› ๋ถ€์กฑ

์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@jonlambert @j2L4e์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ฒƒ๋“ค์€ ์™„๋ฒฝํ•˜์ง€ ์•Š์ง€๋งŒ, typecheck๋ฅผ ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ์–ธ๊ธ‰ํ•œ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

IMHO, feathers-rest ์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๋Š” ์•ฝ 2์ค„๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํŒจํ‚ค์ง€๋Š” ์ž…๋ ฅํ•  ๊ฐ€์น˜๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค :-)

๋ฌด์—‡์„ ๋ฐ”๊ฟจ๋Š”์ง€ ๊ธฐ์–ต๋„ ์•ˆ๋‚˜๋Š”๋ฐ ํ›„ํฌ์™€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

@j2L4e feathers ๊ฐ€ TypeScript๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์˜€์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ํ™•์‹คํžˆ '์ง€์›'๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

TypeScript๋Š” ์•ฑ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์— ํ•„์ˆ˜์ ์ด๋ฏ€๋กœ @myknbani ์˜ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ฑฑ์ •๋งˆ์„ธ์š”! ๐Ÿ™‚

ํ•ด๋‹น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ์กฐ์ž‘์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ณต์‹ repos์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค๋ก€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‹œ๋„์กฐ์ฐจํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Feathers ํ•ต์‹ฌ ํŒ€ ์ค‘ ๋ˆ„๊ตฌ๋„ Typescript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ •์˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ง€์‹์ด ์—†์Œ
  2. ์†Œ์ˆ˜์˜ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์ด ์ •์˜๋ฅผ "์š”๊ตฌ"ํ•  ๋•Œ ์ •์˜ ์ž‘์—…์— ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์œ„ํ•ด ์ž‘์—…ํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ๋‚˜๋Š” ์ด ๋ฌธ์ œ์˜ ์กด์žฌ์™€ ์œ„์˜ ์„ค๋ช…์œผ๋กœ TS ์ง€์›์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฒฐ๋ก ์ด๋ผ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ "์ž‘๋™"ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์œ ํ˜• ์ •์˜๊ฐ€ API์™€ ํ•จ๊ป˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉด ํ–ฅํ›„ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋„ค๊ฐ€ ์˜ณ์•„.

๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ์— ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ์—ˆ๊ณ  ํƒ€์ดํ•‘ ์™„๋ฃŒ๊ฐ€ ๊ณ„ํš๋˜์–ด ์žˆ๊ณ  ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค ๐Ÿ™‚ ์ง€๊ธˆ๊นŒ์ง€ ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์—…์„ ์ •๋ง ์ฆ๊ธฐ๊ณ  TS์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค ๐ŸŽ‰

ํ•ด๋‹น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์—†์ด๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ์กฐ์ž‘์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ณต์‹ repos์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค๋ก€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‹œ๋„์กฐ์ฐจํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@j2L4e ๋งž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” typedef๊ฐ€ ์ง€๊ธˆ ํ›จ์”ฌ ๋” ๋‚˜์€ ์ƒํƒœ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด "๋ฌด์‹œ"์ง€๊ธˆ๊นŒ์ง€ ๋‚จ์•„์žˆ๋Š” ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๋ชจ๋‘๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ์‚ญ์ œ ! (์˜ ์‚ฌ์ดŒ ์ฃผ์žฅ strictNullChecks ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ) app.service(...) .

์„œ๋น„์Šค ์ •์˜(์„œ๋น„์Šค ๋ฐฉ๋ฒ•์ด ๋ชจ๋‘ ์„ ํƒ ์‚ฌํ•ญ์ธ ๊ฒฝ์šฐ)์™€ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค(๋ชจ๋“  ์„œ๋น„์Šค ๋ฐฉ๋ฒ•์ด ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)์— ๋Œ€ํ•œ ์œ ํ˜•์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ! await app.service('api/foos').create!([{ ๋„์ฒ˜์— ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

interface ServiceDefinition<T> {
    find?(params?: Params, callback?: any): Promise<T[] | Pagination<T>>;
    get?(id: number | string, params?: Params, callback?: any): Promise<T>;
    create?(data: T | T[], params?: Params, callback?: any): Promise<T | T[]>;
    update?(id: NullableId, data: T, params?: Params, callback?: any): Promise<T>;
    patch?(id: NullableId, data: any, params?: Params, callback?: any): Promise<T>;
    remove?(id: NullableId, params?: Params, callback?: any): Promise<T>;
    setup?(app?: Application, path?: string): void;
  }

  interface ServiceInstance<T> extends events.EventEmitter {
    find(params?: Params, callback?: any): Promise<T[] | Pagination<T>>;
    get(id: number | string, params?: Params, callback?: any): Promise<T>;
    create(data: T | T[], params?: Params, callback?: any): Promise<T | T[]>;
    update(id: NullableId, data: T, params?: Params, callback?: any): Promise<T>;
    patch(id: NullableId, data: any, params?: Params, callback?: any): Promise<T>;
    remove(id: NullableId, params?: Params, callback?: any): Promise<T>;
  }

์–ด๋•Œ์š”?

  interface GetMethod<T>{
    /**
     * Retrieves a list of all resources from the service.
     * Provider parameters will be passed as params.query
     */
    find(params?: Params, callback?: any): Promise<T[] | Pagination<T>>;
  }

  interface FindMethod<T>{
    /**
     * Retrieves a single resource with the given id from the service.
     */
    get(id: number | string, params?: Params, callback?: any): Promise<T>;
  }

  interface CreateMethod<T>{
    /**
     * Creates a new resource with data.
     */
    create(data: T[], params?: Params, callback?: any): Promise<T[]>;
    create(data: T, params?: Params, callback?: any): Promise<T>;
  }

  interface UpdateMethod<T>{
    /**
     * Replaces the resource identified by id with data.
     * Update multiples resources with id equal `null`
     */
    update(id: NullableId, data: T, params?: Params, callback?: any): Promise<T>;
  }

  interface PatchMethod<T>{
    /**
     * Merges the existing data of the resource identified by id with the new data.
     * Implement patch additionally to update if you want to separate between partial and full updates and support the PATCH HTTP method.
     * Patch multiples resources with id equal `null`
     */
    patch(id: NullableId, data: any, params?: Params, callback?: any): Promise<T>;
  }

  interface RemoveMethod<T>{
    /**
     * Removes the resource with id.
     * Delete multiple resources with id equal `null`
     */
    remove(id: NullableId, params?: Params, callback?: any): Promise<T>;
  }

  interface OptionalMethods <T> {
    find?(params?: Params, callback?: any): Promise<T[] | Pagination<T>>;
    get?(id: number | string, params?: Params, callback?: any): Promise<T>;
    create?(data: T[], params?: Params, callback?: any): Promise<T[]>;
    create?(data: T, params?: Params, callback?: any): Promise<T>;
    update?(id: NullableId, data: T, params?: Params, callback?: any): Promise<T>;
    patch?(id: NullableId, data: any, params?: Params, callback?: any): Promise<T>;
    remove?(id: NullableId, params?: Params, callback?: any): Promise<T>;
  }

  type GetService<T> = GetMethod<T> & ServiceAddons;
  type FindService<T> = FindMethod<T> & ServiceAddons;
  type CreateService<T> = CreateMethod<T> & ServiceAddons;
  type UpdateService<T> = UpdateMethod<T> & ServiceAddons;
  type PatchService<T> = PatchMethod<T> & ServiceAddons;
  type RemoveService<T> = RemoveMethod<T> & ServiceAddons;

  interface ServiceCore<T> extends OptionalMethods<T> {
    setup?(app?: Application<any>, path?: string): void;
  }

  interface ServiceAddons extends events.EventEmitter {
    filter(any?: any): this;
  }

  type Service<T> = OptionalMethods<T> & ServiceAddons;

์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋น„ TS ์„œ๋น„์Šค๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: feathers-mailer:

type MailerService = CreateService<Mail>;

๋˜๋Š” ์ƒ์„ฑ ๋ฐ ์‚ญ์ œ๋งŒ ๊ฐ€๋Šฅํ•œ (์•„์ฃผ ์“ธ๋ชจ์—†๋Š”) ์„œ๋น„์Šค:

type TrashyService<T> = CreateService<T> & RemoveService<T>;

์ด๊ฒƒ์€ ์„ ํƒ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์—ผ๋‘์— ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: app.service(s => s.mailout))๋Š” ์ ์ ˆํ•œ ์œ ํ˜•์œผ๋กœ ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด:

image

๋‹ค์‹œ ์ฒดํฌ์ธํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ง€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? @j2L4post ^ ์ •๋ง

์ž, ์ง€๊ธˆ๊นŒ์ง€ ๋ณด๊ณ  ์žˆ๋Š” ์˜ค๋ฅ˜:

import * as handler from 'feathers-errors/handler';
import * as notFound from 'feathers-errors/not-found'; //[1]

app.use(notFound()); //[2]
app.use(handler()); //[3]

[1]

[ts] ๋ชจ๋“ˆ '"c:/Users/George/Source/Repos/ts4/node_modules/feathers-errors/not-found"'๋Š” ๋ชจ๋“ˆ์ด ์•„๋‹Œ ์—”ํ„ฐํ‹ฐ๋กœ ํ™•์ธ๋˜๋ฉฐ ์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

[2]

'Function' ์œ ํ˜•์˜ ์ธ์ˆ˜๋Š” 'PathParams' ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
'ํ•จ์ˆ˜' ์œ ํ˜•์€ '(๋ฌธ์ž์—ด | RegExp)[]' ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
'ํ•จ์ˆ˜' ์œ ํ˜•์— 'ํ‘ธ์‹œ' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

[์‚ผ]

'Function' ์œ ํ˜•์˜ ์ธ์ˆ˜๋Š” 'PathParams' ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
'ํ•จ์ˆ˜' ์œ ํ˜•์€ '(๋ฌธ์ž์—ด | RegExp)[]' ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
(๋ณ„์นญ) notFound(): ํ•จ์ˆ˜

๊ธฐ์กด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ ๋ฒ„์ „์—์„œ๋Š” @j2L4e ๊ฐ€

npm i -g lerna
git clone -b buzzard-j2L4e  https://github.com/feathersjs-ecosystem/feathers-typescript.git
cd feathers-typescript
lerna bootstrap

lerna๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€์™€ dep๋ฅผ ์—ฐ๊ฒฐํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด์ œ ./packages/tests ํ•˜์œ„ ํด๋”(์•„์ง ํ…Œ์ŠคํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ผ์ข…์˜ ๋†€์ดํ„ฐ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค)๋กœ ์ด๋™ํ•˜์—ฌ TS์˜ ์žฅ์ ์„ ์‚ฌ์šฉํ•ด ๋ณด์‹ญ์‹œ์˜ค! index.ts๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ ค๋ฉด ./packages/tests์—์„œ npm start ๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

Feathers 2์—์„œ 3์œผ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋ง‰ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ์ด์ œ head @feathersjs ํŒจํ‚ค์ง€์—์„œ index.d.ts ํŒŒ์ผ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณต์›ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํ•œ ๊ฐ€์ง€ ์˜๊ฒฌ๊ณผ ๊ฐ™์ด https://github.com/feathersjs-ecosystem/feathers-typescript/tree/buzzard-j2L4e ๋กœ ์ด๋™๋˜์–ด ํ™•์‹คํžˆ ์œ ํ˜•์ด ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. @j2L4e ๋Š” ์ง€๊ธˆ ๋„ˆ๋ฌด ๋ฐ”๋น ์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๋Œ€๋ถ€๋ถ„ Linting์„ ํ†ต๊ณผํ•˜๊ณ  ์ด๋ฅผ ํ™•์‹คํžˆ Typed์— ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๊บผ์ด ์ด ์ผ์„ ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์Šค์Šค๋กœ ๊ฐ๋‹นํ•  ๊ณ„ํš์ด ์—†๋Š” ์‚ฌ๋žŒ์„ ๊ธฐ๊บผ์ด ๋•๊ฒ ์Šต๋‹ˆ๋‹ค.

๋„ค, ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž‘์—…์ด์—ˆ๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ํ”ผ๋“œ๋ฐฑ์€ ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋˜๋Š”๋Œ€๋กœ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋นจ๋ฆฌ.

๋ˆ„๊ตฐ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์ฐจ์ž„๋ฒจ์„ ์šธ๋ฆฌ๋ฉด ์ •๋ง ์ •๋ง ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” DT ๋ฆฐํŒ…์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

slack์—์„œ ๋น ๋ฅธ ๋ณต์‚ฌ ๋ฐ ๋ถ™์—ฌ๋„ฃ๊ธฐ:

์—ฌ๋Ÿฌ๋ถ„, ์ €๋Š” ์ง€๊ธˆ ์ •๋ง ๋„ˆ๋ฌด ๋ฐ”๋น ์„œ ํƒ€์ดํ•‘์ด ์ตœ์šฐ์„ ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ž‘๋™ํ•˜์ง€๋งŒ ํ™•์‹คํžˆ ์œ ํ˜•์€ ๋ฆฐํŠธ ๊ทœ์น™ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์—„๊ฒฉํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ดํ•‘์ด ํ™•์‹คํžˆ ํƒ€์ดํ•‘๋œ ๋ฆฐํŠธ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/j2L4e/Reservationlytyped ์—ฌ๊ธฐ์—์„œ ๋‚ด DT ํฌํฌ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. types/feathersjs__packagename ์—์„œ feathersjs ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

clone, npm์€ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜์— linter๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: npm run lint @feathersjs/feathers (ํŽธ์ง‘๋จ)).

@feathersjs/feathers ์€ ์ด๋ฏธ ์ œ๋Œ€๋กœ linting๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ฐธ์กฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํŽธ์ง‘๋จ)

TypeScript ์ •์˜๋Š” https://github.com/DefinitelyTyped/DefinitelyTyped/pull/22805 ์—์„œ ConfirmTyped์— ๊ฒ€ํ† ๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ 

์ด์ œ NPM์„ ํ†ตํ•ด ์ •์˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์˜ˆ, @feathersjs/package ํŒจํ‚ค์ง€์— @types/feathersjs__package ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค!

@erikma ์ง€์›

@j2L4 ์ˆ˜๊ณ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ๋ชจ๋“  @featherjs/express ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๊นŒ? typescript ์ •์˜ ํŒŒ์ผ์—์„œ rest, json, notFound ๋ฐ urlencoded์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

image

๋‹น์‹  ๋ง์ด ๋งž์•„, ๊ทธ๊ฒƒ๋“ค์ด ๋น ์ ธ์žˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€๊ธˆ typings.d.ts ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

import { ErrorRequestHandler, RequestHandler } from 'express';

declare module '@feathersjs/express' {
    export function errorHandler(options?: any): ErrorRequestHandler;
    export function notFound(): RequestHandler;
    export const rest: {
        (): () => void;
        formatter: RequestHandler;
    };
}

urlencoded๊ฐ€ ์–ด๋””๋กœ ๊ฐ€์•ผํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

urlencoded ๋ฐ json ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์—์„œ express ์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. express ์ž…๋ ฅ์ด ์•„์ง ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ express ๋˜๋Š” feathersjs/express์ž…๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ Import { urlencoded, json } from '@feathersjs/express' ์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด๋ณด๋‚ธ original ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์—์„œ ๋‚ด ๋ณด๋‚ธ ๋ชจ๋“  require('express') ์— ์˜ํ•ด ๋‹ค์‹œ ์ˆ˜์ถœ์ด๋‹ค @feathersjs/express : https://github.com/feathersjs/express/blob/master/lib/index.js#L82

image
๋˜ํ•œ, ์ •์˜๊ฐ€ ์ข‹์€ channel.t๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์งง์€ ์‹œ๊ฐ„์— ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๋‹น์‹ ์—๊ฒŒ ๋˜์ ธ์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@types/feathersjs__socket-commons ๊ฐ€์ ธ์˜ค๊ธฐ

์ˆ˜์ž…? ๋‚œ ์ดํ•ด๊ฐ€ ์•ˆ ๋ผ์š”

์ฃ„์†กํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ '@feathersjs/socket-commons ๊ฐ€์ ธ์˜ค๊ธฐ'๋ผ๊ณ  ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์œ ํ˜•์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@types/feathersjs__feathers ์„ค์น˜ํ•˜๋ฉด app.channel ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ @types/feathersjs__socket-commons ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด app.on ๊ฐ€ ์ž‘๋™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ Typed/DefinitelyTyped#23195๋ฅผ ํ†ตํ•ด ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ถ”๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”: https://github.com/feathersjs-ecosystem/feathers-typescript/issues

TS ์ •์˜์— ๋Œ€ํ•œ ๋ฌธ์ œ ์ถ”์ ์€ ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์‚ฌ๋žŒ๋“ค์„ feather-typescript repo๋กœ ์•ˆ๋‚ดํ•˜๊ณ  ์žˆ์ง€๋งŒ _"์ด repo๋Š” ์ด์ œ ๊ตฌ์‹์ž…๋‹ˆ๋‹ค"_๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค . ๊ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ •์˜๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  DT๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ DT ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ๋„ ๋ฌธ์ œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์‹œ๋„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๋Ÿฌ ์ฑ„๋„์„ ํ†ตํ•ด ์š”์ฒญ์„ ๋ฐ›์•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ณณ์œผ๋กœ ๊ฐ€๋„๋ก ์ง€์‹œํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๊ฒƒ์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•œ ๊ณณ์ด๋ฉด ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ๋ณ„๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์ด์œ ๊ฐ€ feathers.services.dogs ๋Œ€์‹  feathers.service('dogs') ?

์˜ˆ. feathers.service('dogs') ๋Š” defaultService (ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์„œ๋น„์Šค ์ด๋ฆ„์—์„œ ์Šฌ๋ž˜์‹œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ดํ”„ ๋ผ์ดํ„ฐ ์ •์˜์—์žˆ๋‹ค DefinitelyTyped .

๋ฌธ์ œ ๋ฐ ์งˆ๋ฌธ์€ https://github.com/feathersjs-ecosystem/feathers-typescript/issues๋กœ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰