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 ์ ์๋ฅผ ์ง์ํ์ธ์!
์, ๋ฐฉ๊ธ 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์ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
(์ ์ด๋ ๊ฐ์ฅ ์ข์ ๊ฒฝ์ฐ)
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ/
์ธ๋ด์ฌ๊ณผ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@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 ์, ์์ ์ ๋๋ค.
์ถ์ ์ผ์ ์ ๋ฌธ์ ๋ ๋ฌด์์ด๋ฉฐ ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฌด์์ ํ ์ ์์ต๋๊น? ์ฌ๊ธฐ์ ์ด์ ํ ๋ ์ฌ์ ํ ๋๋ต์ ์ธ ๊ณํ์ ๋๋ค.
ํด๋น ๊ธฐ๋ฅ์ด ์ถ์๋๋ฉด ์ ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ํ๋ก์ธ์ค๋ ๋ฌด์์ ๋๊น?
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๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์์ ์ํํฉ๋๋ค.
๊ณต์ ์ ์๋ฅผ ์์ฑ/์ ์งํ๋ ค๋ ์ฌ๋๋ค์ ์ํด ์ ๋ฌธ์์ ์์ฝ์์คํ ์น์ ์ ๋งํฌํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ์ฌ์ฉํ์ง ์๊ณ 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 ์
๊ทธ๋ฌ๋ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์๋น์ค ๋ฐฉ๋ฒ์ ์ ํ ์ฌํญ์
๋๋ค.
๋ณด๋ค
๊ทธ๋ผ ์๋น์ค ์ ์๋ ์๋์ ๊ฐ์์ผ ํ์ง ์์๊น์?
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๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์์ ์ํํฉ๋๋ค.
- ์ ์๋ฅผ ์ ์ ํ๊ฒ ์ ์งํ๊ธฐ ์ํ ์ ์ ํ ์ง์์ด ์์
- ์์์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ด ์ ์๋ฅผ "์๊ตฌ"ํ ๋ ์ ์ ์์ ์ ์๊ฐ์ ํ ์ ํ ์ ์์ต๋๋ค. ๋ ๋ง์ ์ฌ๋๋ค์๊ฒ ์ํฅ์ ๋ฏธ์น๊ธฐ ์ํด ์์ ํด์ผ ํ ๋ค๋ฅธ ํญ๋ชฉ์ด ๋ง์ด ์์ต๋๋ค.
ํ๋ ์์ํฌ๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋์ผ๋ก์ ๋๋ ์ด ๋ฌธ์ ์ ์กด์ฌ์ ์์ ์ค๋ช ์ผ๋ก 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))๋ ์ ์ ํ ์ ํ์ผ๋ก ํด๋น ์๋น์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ฏ์ด:
๋ค์ ์ฒดํฌ์ธํ๋ ์ค์ ๋๋ค. ์ด๋ป๊ฒ ์ง๋ด๊ณ ์์ต๋๊น? @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์ ๋ํ ์ธ๊ธ์ ์ฐพ์ ์ ์์ต๋๋ค.
๋น์ ๋ง์ด ๋ง์, ๊ทธ๊ฒ๋ค์ด ๋น ์ ธ์๋ค.
๋ค์์ ์ฌ์ฉํ์ฌ ์ง๊ธ 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
๋ํ, ์ ์๊ฐ ์ข์ 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๋ก ๋ณด๋ด์ฃผ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ์๊ฐ ์๋ ํฌํฌ:
๋๋ ์ฝ๊ฐ์ ์ผ์ด ์์์ง๋ง ๊นํธ๊ณผ ํ์์ฒด๋ฅผ ์ข์ํฉ๋๋ค.