Typescript: npm ๋งํฌ๊ฐ€์žˆ๋Š” ์ค‘๋ณต ์œ ํ˜• ์„ ์–ธ

์— ๋งŒ๋“  2016๋…„ 01์›” 15์ผ  ยท  147์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

TypeScript ์‚ฌ์šฉ 1.7.3.

์•„๋ž˜ npm ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
์„ ์–ธ ํŒŒ์ผ์€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฉฐ ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ -A

ts src :

export default class ClassA {
  private foo: string;
  bar: number;
}

ts ์„ ์–ธ :

declare class ClassA {
  private foo;
  bar: number;
}
export default ClassA;

package-b (package-a์— ๋”ฐ๋ผ ๋‹ค๋ฆ„) :

ts src :

import ClassA from 'package-a';

namespace ClassAFactory {
  export function create(): ClassA {
    return new ClassA();
  }
}
export default ClassAFactory;

ts ์„ ์–ธ :

import ClassA from 'package-a';

declare namespace ClassAFactory {
  function create(): ClassA;
}
export default ClassAFactory;

package-c (package-a ๋ฐ package-b์— ๋”ฐ๋ผ ๋‹ค๋ฆ„) :

ts src :

import ClassA from 'package-a';
import ClassAFactory from 'package-b';

let classA: ClassA;
classA = ClassAFactory.create(); // error!!

๋งˆ์ง€๋ง‰ ์ค„์€ ์ปดํŒŒ์ผ ์ค‘์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

error TS2322: Type 'ClassA' is not assignable to type 'ClassA'.
Types have separate declarations of a private property 'foo'.

package-a ์„ ์–ธ์—์„œ private foo; ์ค„์„ ์ œ๊ฑฐํ•˜๋ฉด TypeScript์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์•ฝ๊ฐ„ ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ ์†์„ฑ์„ ์„ ์–ธ์— ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ž„์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค (https://github.com/Microsoft/TypeScript/issues/1532).
TypeScript๋Š” ๋ณ€์ˆ˜ ํ• ๋‹น์„ ์ปดํŒŒ์ผ ํ•  ๋•Œ ๊ฐœ์ธ ์†์„ฑ์„ ๋ฌด์‹œํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@types Bug Fixed

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

์ด๋ฆ„๊ณผ ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘๋ณต ํŒจํ‚ค์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๊ฒŒ์‹œ ๋  ๋•Œ typescript@next ์„ (๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

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

์—ฌ๊ธฐ์—๋Š” ClassA ์˜ ๋ฃจํŠธ ์„ ์–ธ์ด ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฏ€๋กœ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. npm link ์™€ (๊ณผ) ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

npm link ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ˆœํžˆ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

|
-- node_modules
    |
    -- package-a
    |   |
    |   -- index.d.ts
    |   |
    |   ...
    |
    -- package-b
        |
        -- index.d.ts
        |
        -- node_modules
        |   |
        |   -- package-a
        |       |
        |       -- index.d.ts
        |       |
        |       ...
        |
        ...

ํ‘œ์‹œ๋œ๋Œ€๋กœ package-a์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์„ ์–ธ ํŒŒ์ผ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
npm install ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜ํ•˜๋ฉด์ด ๊ฒฝ์šฐ package-a ์„ ์–ธ์ด package-b์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ์ง€ ๋งŒ ์–ด๋ ต๊ณ  ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฒฐ๊ตญ npm link ํ•˜์ง€ ์•Š์•˜๊ณ  ์ด๊ฒƒ์€ ๋” ์ด์ƒ ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ : wink :

์‹ค์ œ๋กœ ๋””์Šคํฌ์—๋Š” ๋‘ ๊ฐœ์˜ ClassA ์„ ์–ธ์ด์žˆ๋Š” ๋‘ ๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋ฅ˜๊ฐ€ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์œ ํ˜•์„ ๋น„๊ตํ•  ๋•Œ ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ด์ „์— https://github.com/Microsoft/TypeScript/issues/4800 ์—์„œ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Enums์˜ ๊ฒฝ์šฐ ๊ทœ์น™์„ ์ค€๊ณต ์นญ ๊ฒ€์‚ฌ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ˆ˜์—…์— ๋Œ€ํ•ด์„œ๋„ ๋˜‘๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ด€๋ จ ํŒจํ‚ค์ง€๊ฐ€ NPM์— ์—ฐ๊ฒฐ๋œ TS 1.7.5๋กœ ์ด๊ฒƒ์— +1. ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๊ณ ํ–ˆ์ง€๋งŒ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ์‹œ๋„ํ•˜๋“  TS๋Š” ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ TS2345๋กœ ์‹คํŒจํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ดœ์ฐฎ ์•˜์œผ๋ฉฐ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” .d.ts ํŒŒ์ผ์˜ ๋ชจ๋“  ์‚ฌ๋ณธ์€ ๋™์ผํ•œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜€์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๋‚ด์—์„œ ๋‹ค๋ฅธ ์„ ์–ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Typescript์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‘ ๊ฐ€์ง€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์„ ์„ ์–ธ ํ•œ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฐํž ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋‘ ๊ฐ€์ง€ ์ •์˜๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ถฉ๋Œํ•˜๋Š” ์‹์— <any> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์ด์ „์— ํ•„์š”ํ•˜์ง€ ์•Š์•˜๋˜ ๋‹ค๋ฅธ ์œ ํ˜• ์ฃผ์„์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ์–ธ์  ๊ฐ€ ๋ถ„๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋‚ด ๊ฒฝ์šฐ NPM ๋งํฌ๊ฐ€ ์ž‘๋™ ์ค‘์ž„์„ ๋ถ„๋ช…ํžˆํ–ˆ์Šต๋‹ˆ๋‹ค.

TS 1.8์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์—ˆ์œผ๋ฉฐ ํ•ด๋‹น ๋ฒ„์ „์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. package.json ์ข…์†์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํŒ…ํ–ˆ์ง€๋งŒ ์ด์ œ ๊ฐœ๋ฐœ ์ค‘์— npm link ์‚ฌ์šฉํ•  ๋•Œ์ด ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ ๋งŒํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ๋„ ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” Lerna ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Typescript ๋ฒ„์ „ 2.0.3.

๋ถˆํ–‰ํžˆ๋„ Lerna์™€ ๊ทธ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋Š” ์–ด๋ ค์šด ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ์†Œ๋น„์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์œ ํ˜•์„ ๊ฒ€์‚ฌ ํ•  ์ˆ˜์žˆ๋Š” ์ƒํƒœ์—์„œ ์ œ๋Œ€๋กœ ์ปดํŒŒ์ผ๋˜๋„๋กํ•˜๊ธฐ ์œ„ํ•ด์ด ๋ถˆ์พŒํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

export class MyClass {
  constructor(foo: Foo) {
    (this as any)._foo = foo;
  }

  get foo() {
    return (this as any)._foo as Foo;
  }
}

์ˆ˜์—…์€ ๋งค์šฐ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํž˜๋“ค์ง€ ์•Š์•˜๊ณ  ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, npm link ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

@xogeny npm ๋งํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์ง€ ์ž์„ธํžˆ

@mhegazy ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค ( Observable ์—์„œ rxjs Observable ์„ (๋ฅผ) ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ""Observable "์œ ํ˜•์„ 'Observable"์œ ํ˜•์— ํ• ๋‹น ํ•  ์ˆ˜ ์—†์Œ). ๋ฌผ๋ก  ๋‘ ๋ชจ๋“ˆ ๋ชจ๋‘์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ฒ„์ „์˜ rxjs ์—์„œ Observable ๋ฅผ ์ฐธ์กฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•˜๊ฒŒ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜•์ด "met"์ธ ๊ณณ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ @kimamula ๊ฐ€ npm link ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ ํ•œ๋‹ค๊ณ  ์ง€์ ํ•œ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ rxjs ์ฐธ์กฐํ•˜๋Š” ๋Œ€์‹  ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์— ํ•„์š”).

๊ทธ๊ฒŒ ๋‹น์‹ ์˜ ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•ฉ๋‹ˆ๊นŒ? ์ œ ์‚ฌ๊ฑด์ด ์—ฌ๊ธฐ์—์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๊ฑด๊ณผ ์ „ํ˜€ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ๋„์›€์ด๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ npm link ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด TS2.0์—์„œ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค (https://github.com/Microsoft/TypeScript/pull/8486 ๋ฐ # 8346 ์ฐธ์กฐ). npm ๋งํฌ๊ฐ€ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ณณ์„ ๋ณผ ์ˆ˜์žˆ๋Š” ์ƒ˜ํ”Œ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ—ˆ. 2.0.3์„ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค (ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค). ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , TS 2.0์—์„œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์•”์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

https://github.com/ReactiveX/rxjs/issues/1858
https://github.com/ReactiveX/rxjs/issues/1744

Lerna repo์—์„œ๋ณด๊ณ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ๋‹ค์†Œ ๊ด€๋ จ์ด ์žˆ์œผ๋ฏ€๋กœ https://github.com/seansfkelley/typescript-lerna-webpack-sadness ์—์„œ ์ œ๊ฑฐ ๋œ ๋ฒ„์ „์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค https://github.com/TypeStrong/ts-loader/issues/324๋„ ๊ฑฐ๊ธฐ์— ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” typescript 2.0.3์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Observable ์—์„œ์ด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Type 'Observable<Location[]>' is not assignable to type 'Observable<Location[]>'. Property 
            'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.

๋‚˜๋Š” Lerna monorepo ํŒจํ‚ค์ง€์—์„œ๋„ ์ด๊ฒƒ์„ ์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„๊ธฐ๋ฅผ ๋”ฐ๋ผ ์ด๋™ํ•˜๋ฉด ๋™์ผํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์œ ํ˜•์ด๋ฉ๋‹ˆ๋‹ค.

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

์ข…์†์„ฑ A์— ์˜์กดํ•˜๋Š” ์•ฑ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค. ์ข…์†์„ฑ A๋Š” ์ข…์†์„ฑ B์— ์˜์กดํ•˜๋ฉฐ ์ข…์†์„ฑ B์˜ ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•ฑ๊ณผ ์ข…์†์„ฑ A๋Š” ๋ชจ๋‘ npm link ์ข…์†์„ฑ B์ด๋ฉฐ ์œ ํ˜•์„ ๊ฐ€์ ธ ์™€์„œ ๋™์ผํ•œ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด๋ฏธ ๋งŽ์€ ์‹œ๊ฐ„์„ ์žƒ์—ˆ ๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ private ๋ฐ protected ์†์„ฑ์„ ๋ชจ๋‘ ์‚ดํŽด๋ณด๊ณ  ์ œ๊ฑฐํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. :

TSError: โจฏ Unable to compile TypeScript
tests/helpers/test-application.ts (71,11): Argument of type '{ initializers: Initializer[]; rootPath: string; }' is not assignable to parameter of type 'ConstructorOptions'.
  Types of property 'initializers' are incompatible.
    Type 'Initializer[]' is not assignable to type 'Initializer[]'.
      Type 'Application.Initializer' is not assignable to type 'Application.Initializer'.
        Types of property 'initialize' are incompatible.
          Type '(app: Application) => void' is not assignable to type '(app: Application) => void'.
            Types of parameters 'app' and 'app' are incompatible.
              Type 'Application' is not assignable to type 'Application'.
                Types of property 'container' are incompatible.
                  Type 'Container' is not assignable to type 'Container'.
                    Types of property 'resolver' are incompatible.
                      Type 'Resolver' is not assignable to type 'Resolver'.
                        Types of property 'ui' are incompatible.
                          Type 'UI' is not assignable to type 'UI'.
                            Property 'logLevel' is protected but type 'UI' is not a class derived from 'UI'. (2345)

์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@tomdale Webpack, tsc ๋˜๋Š” ๋‹ค๋ฅธ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ฌธ์ œ๋Š” Webpack์„ ํ†ตํ•ด ์ปดํŒŒ์ผ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ( ์ด์ „ ์˜๊ฒฌ ์—์„œ ๋งํฌ ๋œ repo ์ฐธ์กฐ).

@seansfkelley https://github.com/TypeStrong/ts-node ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค

๋งž์Šต๋‹ˆ๋‹ค. ts-node (๋ฃจํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์šฉ)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข…์†์„ฑ์€ tsc ์ปดํŒŒ์ผ ๋œ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ์ด ๋ฌธ์ œ์— ๋ถ€๋”ช ํ˜”๊ณ  ๋ฐฑ์—”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์‹œ๋„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘์— ์šฐ๋ฆฌ๋Š” ์ข…์ข… npm์„ ์šฐ๋ฆฌ์˜ ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ ํŠน์ • ๋ฌธ์ œ๋Š” rxjs Observables ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‚ฌ์šฉ์ž…๋‹ˆ๋‹ค.

// in repo A
export class HttpAdapter {
    request(url: string, options?: HttpRequestOptionsArgs): Observable<HttpResponse> {
        return Observable.of({});
    }
}

// in repo B
export class HttpRequestAdapter implements HttpAdapter {
    request(url: string, options?: HttpRequestOptionsArgs): Observable<HttpResponse> {
        return Observable.of({});
    }
}

์ด๊ฒƒ์€ npm link ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘๋™ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

Error:(10, 14) TS2420:Class 'HttpRequestAdapter' incorrectly implements interface 'HttpAdapter'.
  Types of property 'request' are incompatible.
    Type '(url: string, options?: HttpRequestOptionsArgs) => Observable<HttpResponse>' is not assignable to type '(url: string, options?: HttpRequestOptionsArgs) => Observable<HttpResponse>'.
      Type 'Observable<HttpResponse>' is not assignable to type 'Observable<HttpResponse>'.
        Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.

๋‚ด๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์ œ์•ˆ์€ private ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ๋” ์ด์ƒ private ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  JavaScript ์Šคํƒ€์ผ์˜ _ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„๋กœ ์‹คํ–‰ https://github.com/Microsoft/TypeScript/issues/7755 ์™œ ์ฃผ๋ณ€์— ๋น„์Šทํ•œ ๋…ผ์˜๋˜๋Š” private ๋ช…๋ชฉ ํ˜• ์‹œ์Šคํ…œ์— ํ‚ฅ์„ ๋Œ€์‹  ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ  ๋”ฐ๋ผ์„œ ๊ทธ๊ฒƒ์„ ๊ธˆ์ง€ ํ•œ ๋‚ด ๋ฒ„์ „ ์ฐจ์ด (์˜ˆ : NPM 2 ๋˜๋Š” npm link )๋กœ ๋๋‚˜๊ธฐ ๋„ˆ๋ฌด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@blakeembrey ๋‹น์‹ ์ด ๋น„๊ณต๊ฐœ๋ฅผ ํ”ผํ•œ๋‹ค๊ณ  ๋งํ•  ๋•Œ, ๋‚ด ์ฝ”๋“œ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ? Observable ์œ ํ˜• ์ •์˜๊ฐ€ ๋ฌธ์ œ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@jeffwhelpley ๋„ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. Observable ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ private ์กฐ์–ธ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํฌ๋ฐ•ํ•˜๊ณ  ๋‹น์‹ ์—๊ฒŒ ์ „์ ์œผ๋กœ ์ ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ๐Ÿ˜„ ์•„๋งˆ๋„ private ์‚ฌ์šฉ์— ๋Œ€ํ•ด rxjs ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค private ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ

ํŽธ์ง‘ : ๋‚˜๋Š” ์ด์ „์— ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ž๊ณ  ๋‚ด ๊ฒฝํ—˜์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ https://github.com/Microsoft/TypeScript/issues/ ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋‚ด ์ƒ๊ฐ์„ ๋‹ค์‹œ ์ ์–ด ๋‘˜ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. @tomdale ์ด private ๋ฐ protected ์ œ๊ฑฐ๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ณณ์—์„œ ๋‚˜๋Š” ์–ผ๋งˆ ์ „์— ๋˜‘๊ฐ™์ดํ–ˆ์Šต๋‹ˆ๋‹ค).

@mhegazy ๋กœ๋ถ€ํ„ฐ npm link ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์šฐ๋ฆฌ์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๊นŒ? TS 2.0+์—์„œ ์ธ์ • ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์–ด๋”˜๊ฐ€์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?!?

์ด ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ npm link ๋กœ ์ธํ•œ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. npm install file.tar.gz ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•˜๋ฉด ์—ฌ์ „ํžˆ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

app/app.component.ts(46,5): error TS2322: Type 'Observable<boolean | Account>' is not assignable to type 'Observable<boolean | Account>'.
  Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.

๋‚ด app.component.ts ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export class AppComponent implements OnInit {
  private user$: Observable<Account | boolean>;
  private loggedIn$: Observable<boolean>;
  private login: boolean;
  private register: boolean;

  constructor(public stormpath: Stormpath) {}

  ngOnInit() {
    this.login = true;
    this.register = false;
    this.user$ = this.stormpath.user$;
    this.loggedIn$ = this.user$.map(user => !!user);
  }

this.user$ ๋ผ์ธ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Stormpath ์—๋Š” user$ ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@Injectable()
export class Stormpath {

  user$: Observable<Account | boolean>;

@xogeny ์ด์ƒ, ๋‚ด ์ดํ•ด๋Š” ์ •์˜ ID๊ฐ€ ํŒŒ์ผ ์œ„์น˜์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, npm link ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ์ƒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค ( npm link ed ์ข…์†์„ฑ์— ์ž์ฒด ์ข…์†์„ฑ์ด ์„ค์น˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). . ์ •์˜ ID๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด TypeScript์—์„œ ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ JavaScript์—์„œ ์ค‘๋ณต ๋ชจ๋“ˆ๋กœ ๋๋‚˜๋Š” ๋ฐฉ๋ฒ•์€ 12 ๊ฐ€์ง€๋ฟ์ž…๋‹ˆ๋‹ค ( npm install from GitHub, npm install , ์ˆ˜๋™ ๋ณต์ œ, ๋ฒ„์ „ ์ถฉ๋Œ๋กœ ์ธํ•ด ๋™์ผํ•œ ๋ฒ„์ „์ด ๋‹ค๋ฅธ ์œ„์น˜์— ๋„์ฐฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ ๋ชจ๋“ˆ ํ•ด์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘๋™ ๋ฐฉ์‹ ๋“ฑ).

@blakeembrey ์•„๋งˆ๋„. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฌด์—‡์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ถˆํ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๊ฒƒ์ด๋ผ๋Š” ํฌ๋ง์ด ์žˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. @jeffwhelpley๊ฐ€ ์–ธ๊ธ‰ ํ•œ ๋ชจ๋“  ์ด์œ  ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ์ชฝ์—์„œ๋Š” ์‹ฌ๊ฐํ•œ ๊ฐ€์‹œ์ž…๋‹ˆ๋‹ค.

@xogeny ์•Œ์•„์š”, ์ €๋„ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„ ์—ฐ๊ฒฐ๋œ ๋ฌธ์ œ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ๋ชจ๋‘ ๋‘ ๊ฐœ์˜ (์‹ค์ œ) ํŒŒ์ผ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜ ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ํ•ด๊ฒฐํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ„์น˜๋กœ ํ•ด๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค npm link ed ํŒจํ‚ค์ง€์—์„œ ๋‹ค์‹œ ๋‚ด ๋ณด๋‚ธ ๊ธฐํ˜ธ์™€ ๋‹ค๋ฅผ ์ˆ˜์žˆ๋Š” ์ž์ฒด ์ข…์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ npm link ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฌธ์ œ๋Š” ๋‘ ๊ฐœ์˜ ํŒŒ์ผ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. npm link ๋Š” ๋งํฌ ํ•œ ํ”„๋กœ์ ํŠธ์™€ ๋™์ผํ•œ ์ข…์†์„ฑ ์ธ ๋ฐฉ๊ธˆ ๋งํฌ ํ•œ ์ €์žฅ์†Œ์— ์ข…์†์„ฑ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์žฌํ˜„์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ˆ˜์ค€์—์„œ ๋™์ผํ•œ ์ข…์†์„ฑ์— ๋Œ€ํ•ด npm install ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

image

์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ... ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ (์ง€๊ธˆ๊นŒ์ง€) ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

mkdir a; cd a
npm install rxjs
echo 'import * as rx from "rxjs"; export const myObservable: rx.Observable<number>;' > index.d.ts
echo '{ "name": "a" }' > package.json

cd ..; mkdir b; cd b
npm install rxjs
npm link ../a
echo 'import * as rx from "rxjs"; import * as a from "a"; const x: rx.Observable<number> = a.myObservable;' > index.ts
tsc index.ts --target es6 --moduleResolution node

rxjs ์˜ ๋‘ ๊ฐ€์ง€ ์„ค์น˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

index.ts(1,59): error TS2322: Type 'Observable<number>' is not assignable to type 'Observable<number>'.
  Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.

๋ช…๋ น ์ค„์— ์ž˜ ์ž‘๋™ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ Visual Studio๋Š” ์—ฌ์ „ํžˆ ๋ชจ๋‘ ์—‰๋ง์ด๋ฉ๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/issues/11107#issuecomment -254003380

Windows + Visual Studio 2015์˜ ์ƒˆ๋กœ์šด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ xlib ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ src ๋ฐ dist ํด๋”๋ฅผ node_modules\xlib\src ๋ฐ node_modules\xlib\dist ํด๋”๋กœ robocopyํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค dist ์†Œ๋น„ ํ”„๋กœ์ ํŠธ์˜.

๋ˆ„๊ตฐ๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚ด robocopy ๋ฐฐ์น˜ ํŒŒ์ผ ์Šคํฌ๋ฆฝํŠธ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

:rerunloop
    <strong i="14">@echo</strong> watching for changes to project files..............  (Ctrl-C to cancel)

    <strong i="15">@rem</strong> xlib --> blib and slib
    <strong i="16">@robocopy</strong> .\xlib\src .\blib\node_modules\xlib\src *.*  /MIR /NJH /NJS /NDL /XD .git
    <strong i="17">@if</strong> NOT "%errorlevel%" == "0" (
        <strong i="18">@rem</strong> copy occured, so copy both

        <strong i="19">@robocopy</strong> .\xlib\dist .\blib\node_modules\xlib\dist *.*  /MIR /NJH /NJS /NDL /XD .git   
        <strong i="20">@robocopy</strong> .\xlib\src .\slib\node_modules\xlib\src *.*  /MIR /NJH /NJS /NDL /XD .git     
        <strong i="21">@robocopy</strong> .\xlib\dist .\slib\node_modules\xlib\dist *.*  /MIR /NJH /NJS /NDL /XD .git

        <strong i="22">@rem</strong>  set the src dirs readonly
        <strong i="23">@attrib</strong> +R .\blib\node_modules\xlib\src\*  /S /D
        <strong i="24">@attrib</strong> +R .\slib\node_modules\xlib\src\*  /S /D
    )
    <strong i="25">@timeout</strong> /t 1 /nobreak > NUL
<strong i="26">@goto</strong> rerunloop

์ด ๋ฌธ์ œ๋กœ ๋‹ค์‹œ ๋ฒ„๊ทธ๋ฅผ ๋ณด๋‚ด ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๋Š” ๋™์•ˆ npm link ์„ (๋ฅผ) ์ˆ˜ํ–‰ ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์— ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ TypeScript ๊ธฐ๊ณ ์ž ์ค‘ ํ•œ ๋ช…์ด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์–ด๋””๋ฅผ ์ฐพ์•„์•ผํ• ์ง€์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์ง€์นจ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด PR์„ ๋„์™€์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์œผ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž‘์€ ์•ฑ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ TS๋ฅผ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ์ด๋ฅผ ํ•˜์œ„ ๋ชจ๋“ˆ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ณ โ€ฆ BOOM. TS๋Š” ๋” ์ด์ƒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  TS dist-tag์—์„œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋˜๋‚˜์š”? ๋‚˜๋Š” ํ˜„์žฌ @rc (2.1.1)์—์„œ ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@heruan ๊ณผ @jeffwhelpley ๋Š” typescript@next ๋ฅผ) ์‹œ๋„ํ•ด ์ฃผ์‹œ๋ฉด ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ ์„ค์ •์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

@mhegazy ์ €๋Š” Version 2.2.0-dev.20161129 ์— ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด "์ธํ„ฐํŽ˜์ด์Šค"(ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํด๋ž˜์Šค๋ฅผ Angular 2 DI์˜ ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก)๋ฅผ ํฌํ•จํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (ProjectA๋ผ๊ณ ํ•ฉ์‹œ๋‹ค).

export class ServerAdapter {
    start(opts: ServerOptions): Observable<any> {
        return null;
    }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒซ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€์žˆ๋Š” ์™„์ „ํžˆ ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ (ProjectB๋ผ๊ณ ํ•ฉ์‹œ๋‹ค)์—์„œ :

export class RestifyServerAdapter implements ServerAdapter {
    start(opts: ServerOptions): Observable<any> {
        let server = restify.createServer();
        this.addPreprocessors(server);
        this.addRequestHandler(server, opts);
        return this.startServer(server, opts);
    }

   // more stuff here that is not relevant to this issue
}

ProjectB์— ๋Œ€ํ•œ ์ผ๋ฐ˜ typescript ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ProjectB ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ npm link ProjectA ๋ฅผ ์‹คํ–‰ ํ•œ ๋‹ค์Œ tsc ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Types of property 'start' are incompatible.
    Type '(opts: ServerOptions) => Observable<any>' is not assignable to type '(opts: ServerOptions) => Observable<any>'. Two different types with this name exist, but they are unrelated.
      Type 'Observable<any>' is not assignable to type 'Observable<any>'. Two different types with this name exist, but they are unrelated.
        Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.

๋‚˜๋Š” ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณต์ œ ํ•  ์ˆ˜ ์—†์—ˆ๊ณ  ๋ฌธ์ œ์˜ ์›์ธ์„ ๋†“์น˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ณต์ œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. @jeffwhelpley ๋ฌธ์ œ๋ฅผ ๋ณต์ œํ•˜๋Š” ๋ชจ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Lerna ํ”„๋กœ์ ํŠธ๋Š” ํ›Œ๋ฅญํ•˜๊ณ  ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@heruan ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์„ค์ •ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜, ์ฐธ๊ณ ๋กœ. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ProjectA์™€ ProjectB ๋ชจ๋‘์—์„œ npm link rxjs ์ด๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ProjectA์™€ ProjectB๊ฐ€ ๋™์ผํ•œ rxjs ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ ์—†์ด๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (๋™์ผํ•œ ๋ฒ„์ „ ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ).

ProjectB์—์„œ npm link ProjectA ๋งŒ ๋ฐ›์œผ๋ฉด :

  • ProjectB๋Š” node_modules / rxjs๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.
  • ProjectA๋Š” node_modules / ProjectA์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ์กด์žฌํ•˜๋ฉฐ ์ฐธ์กฐํ•˜๋Š” rxjs๋Š” node_modules / ProjectA / node_modules / rxjs์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‘˜ ๋‹ค npm link rxjs ์ด๋ฉด ๋‘ rxjs ์ฐธ์กฐ๊ฐ€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ „์—ญ npm ์œ„์น˜์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์—ฌ์ „ํžˆ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ ์–ด๋„ ์šฐ๋ฆฌ๋ฅผ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ... ์ด๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๋˜๋Š” ์ค‘์š”ํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ (ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ณผ ์ˆ˜ ์žˆ์Œ) ๋‘ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ : ProjectA ๋ฐ ProjectB)๋Š” ์‹ค์ œ๋กœ ๋น„๊ณต๊ฐœ npm ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

ํžŒํŠธ์— ๋Œ€ํ•ด @jeffwhelpley ์—๊ฒŒ ๊ฐ์‚ฌํ•˜์ง€๋งŒ Lerna๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ชจ๋“ˆ์ด ์ด๋ฏธ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋™์ผํ•œ ํŒŒ์ผ์„ ์ฝ์—ˆ์ง€๋งŒ TS ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‹ค์ œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ๋งํฌ ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •๋ง ๋ฏธ์ณ ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋ˆ„๊ตฌ๋“ ์ง€์ด ๋ฌธ์ œ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ์ด๊ฒƒ์€ npm link ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ณต์œ  ์ข…์†์„ฑ์ด ๋‹ค๋ฅธ ๋ฒ„์ „์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋„์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰. ProjectA๋Š” [email protected] ํ•˜๊ณ  ProjectB๋Š” [email protected]

ProjectA๋ฅผ ProjectB์— ์ข…์†์„ฑ์œผ๋กœ ์„ค์น˜ํ•˜๋ฉด ์ค‘๋ณต ๋œ ์œ ํ˜•๋„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด node_modules/rxjs ์— ํ•˜๋‚˜, node_modules/project_a/node_modules/rxjs ํ•˜๋‚˜, ๋‘ ๊ฐœ์˜ Observable ์„ ์–ธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ProjectA์˜ rxjs ๋ฒ„์ „์„ ~4.9.0 ์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํ—ˆ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ npm install ๋Š” ์ž์ฒด ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œ ํ•  ํ•„์š”๊ฐ€์—†๊ณ  ๋Œ€์‹  ProjectB ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹จ์ง€ ๊ฐœ๋ฐœ ์›Œํฌ ํ”Œ๋กœ์šฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@ andy-ms์˜ ์ œ์•ˆ์— ๋”ฐ๋ผ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค. ์–ด์ œ ์ตœ์‹  2.0.x๋กœ ๋‹ค์‹œ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Angular 1์˜ ํƒ€์ดํ•‘์œผ๋กœ ์ด๊ฒƒ์„ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/DefinitelyTyped/DefinitelyTyped/issues/10082#issuecomment -253023107

์˜ค๋Š˜ ๋‹ค์‹œ ์ด๊ฒƒ, ํŠนํžˆ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚ด ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

node_modules/
folder
  another_folder
    node_modules/ (symlinked to ../../node_modules)
    app/ (angular1 app in typescript)
    tsconfig.json
    (other build files)

@types/angular ๋งŒ ์žˆ์œผ๋ฉด tsc ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ œํ’ˆ๊ตฐ ( @types/angular-{animate,cookies,mocks,resource,route,sanitize} )์ด ์žˆ์œผ๋ฉด ์œ ํ˜• ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

$ npm run tsc

> [email protected] tsc D:\work\angular.io\public\docs\_examples\upgrade-phonecat-1-typescript\ts
> tsc

../../node_modules/@types/angular/index.d.ts(17,21): error TS2300: Duplicate identifier 'angular'.
../../node_modules/@types/angular/index.d.ts(18,21): error TS2300: Duplicate identifier 'ng'.
app/app.animations.ts(5,3): error TS2339: Property 'animation' does not exist on type 'IModule'.
app/app.config.ts(6,45): error TS2305: Module 'angular' has no exported member 'route'.
app/core/checkmark/checkmark.filter.spec.ts(5,22): error TS2339: Property 'mock' does not exist on type 'IAngularStatic'.
app/core/phone/phone.service.spec.ts(18,22): error TS2339: Property 'mock' does not exist on type 'IAngularStatic'.
app/core/phone/phone.service.spec.ts(23,18): error TS2339: Property 'expectGET' does not exist on type 'IHttpBackendService'.
app/core/phone/phone.service.spec.ts(30,18): error TS2339: Property 'verifyNoOutstandingExpectation' does not exist on type 'IHttpBackendService'.
app/core/phone/phone.service.spec.ts(31,18): error TS2339: Property 'verifyNoOutstandingRequest' does not exist on type 'IHttpBackendService'.
app/core/phone/phone.service.spec.ts(39,18): error TS2339: Property 'flush' does not exist on type 'IHttpBackendService'.
app/core/phone/phone.service.ts(5,33): error TS2305: Module 'angular' has no exported member 'resource'.
app/phone-detail/phone-detail.component.spec.ts(5,22): error TS2339: Property 'mock' does not exist on type 'IAngularStatic'.
app/phone-detail/phone-detail.component.spec.ts(18,46): error TS2305: Module 'angular' has no exported member 'route'.
app/phone-detail/phone-detail.component.spec.ts(20,20): error TS2339: Property 'expectGET' does not exist on type 'IHttpBackendService'.
app/phone-detail/phone-detail.component.spec.ts(32,20): error TS2339: Property 'flush' does not exist on type 'IHttpBackendService'.
app/phone-detail/phone-detail.component.ts(7,37): error TS2305: Module 'angular' has no exported member 'route'.
app/phone-list/phone-list.component.spec.ts(6,22): error TS2339: Property 'mock' does not exist on type 'IAngularStatic'.
app/phone-list/phone-list.component.spec.ts(15,20): error TS2339: Property 'expectGET' does not exist on type 'IHttpBackendService'.
app/phone-list/phone-list.component.spec.ts(26,20): error TS2339: Property 'flush' does not exist on type 'IHttpBackendService'.
node_modules/@types/angular-resource/index.d.ts(192,40): error TS2305: Module 'angular' has no exported member 'resource'.
node_modules/@types/angular/index.d.ts(17,21): error TS2300: Duplicate identifier 'angular'.
node_modules/@types/angular/index.d.ts(18,21): error TS2300: Duplicate identifier 'ng'.

๋‚ด๊ฐ€๋ฒ ์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ณ ์ • ../../node_modules/@types ๋กœ typeRoots ๋‚ด์— tsconfig.json :

    "typeRoots": [
      "../../node_modules/@types/"
    ]

๋กœ์ปฌ node_modules/@types ์ถ”๊ฐ€๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@heruan ๋‚ด๊ฐ€ ์‹œ์ž‘ํ•œ ํ•œ ๊ฐ€์ง€ ํ•ดํ‚น์€ lerna ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์—ฐ๊ฒฐ / ์—ฐ๊ฒฐ ํ•ด์ œ๋ฅผ ์œ„ํ•ด ์ž์ฒด npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ lerna run link ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•œ ๋‹ค์Œ ๋ชจ๋“  package.json ํŒŒ์ผ์— link ๋ผ๋Š” npm ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ์Šคํฌ๋ฆฝํŠธ๋Š” (๋‚ด ๊ฒฝ์šฐ์—๋Š”) npm link rxjs ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  npm ๋งํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@jeffwhelpley ์—ฌ๊ธฐ์—์„œ ์†”๋ฃจ์…˜์„ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@yvoronen ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋‚ด ์†”๋ฃจ์…˜์€ ์œ„์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋†’์€ ์ˆ˜์ค€์—์„œ ๋‚ด๊ฐ€ ์ฐพ์€ ํ•ต์‹ฌ์€ ์ž‘์—…์ค‘์ธ ๋ชจ๋“  ๋กœ์ปฌ ํ”„๋กœ์ ํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ npm์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜์žˆ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ œ ๊ฒฝ์šฐ์—๋Š” rxjs๊ฐ€ Observable ๊ฐœ์ฒด์˜ ๊ฐœ์ธ ๋ณ€์ˆ˜). ๊ทธ๋ž˜์„œ lerna ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋กœ์ปฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌ ํ•œ ๋‹ค์Œ lerna run link ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์”ฌ ์•„๋ž˜์—์„œ๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ํด๋” ๋‚ด์—์„œ npm run link ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด package.json์— link ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  "scripts": {
    "link": "npm link my-local-project1 && npm link my-local-project2 && npm link rxjs || true",
    "unlink": "npm unlink my-local-project1 && npm unlink my-local-project2 && npm unlink rxjs && npm i || true"
  }

์ดํ•ด๊ฐ€ ๋˜๊ธธ ๋ฐ”๋ผ์ง€ ๋งŒ ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. @mhegazy ์™€์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค .

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

๊ท€ํ•˜์˜ ์˜๊ฒฌ์ด์ด ํ˜ธ์— ์†ํ•˜๋Š” ๊ฒƒ์ด ํ™•์‹คํ•ฉ๋‹ˆ๊นŒ? ์™„์ „ํžˆ ๋“ค๋ฆฐ๋‹ค
๋‹ค๋ฅธ.

2017 ๋…„ 1 ์›” 12 ์ผ ๋ชฉ์š”์ผ ์˜ค์ „ 3:14 Nikos [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์œ ํ˜• ๋˜๋Š” npm ๋งํฌ AFAIK๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

[์ด๋ฏธ์ง€ : ์ด๋ฏธ์ง€]
https://cloud.githubusercontent.com/assets/216566/21887548/451d059c-d8b8-11e6-86d1-50afae4e5c2f.png

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/Microsoft/TypeScript/issues/6496#issuecomment-272137732 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAUAmcMXodOvU7coymMqGzTofD4pMagpks5rRgsogaJpZM4HFcWl
.

@dobesv ์‹ค์ œ๋กœ ์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ์ „์ฒด ์ด์œ ์ž…๋‹ˆ๋‹ค. TypeScript๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋œ ๊ฒฝ๋กœ์™€ ์‹ค์ œ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ์„ ์–ธ์„ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์„ ์–ธ์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

  1. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. ํฌํ•จ ๋œ ํŒจํ‚ค์ง€๊ฐ€ ๋™์ผํ•œ ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@DanielRosenwasser ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋Œ“๊ธ€์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋Œ“๊ธ€์— ๋Œ€ํ•œ ์‘๋‹ต์ด์—ˆ์Šต๋‹ˆ๋‹ค. "On Thu, Jan 12, 2017, ์˜ค์ „ 3:14 Nikos @ . * > ์ผ๋‹ค"... ๊ทธ๊ฒŒ ๋ˆ„๊ตฌ์ด๋ฉฐ ๊ทธ๋“ค์ด ๋งํ•œ ๋‚ด์šฉ์„ ๋” ์ด์ƒ ๊ธฐ์–ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. npm ๋งํฌ์™€ ๊ด€๋ จ์ด์—†๋Š”์ด ๋Œ“๊ธ€ ์Šค๋ ˆ๋“œ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์งˆ๋ฌธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์žˆ๋Š” ๋™์•ˆ ํŒŒ์ผ ์ด๋ฆ„์ด ์œ ํ˜•์—์„œ ์—ญํ• ์„ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์žฌ๋ฏธ์žˆ๋Š” ์ ์ด ์žˆ์Œ์„ ์–ธ๊ธ‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ €๋Š” RxJS์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ๋Ÿฐ ๋ฐฉ๋ฒ•์ด Observable์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๊ณ  ๋ถˆํ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” HTTP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๊ณผ ๋‹ค๋ฅธ rxjs์˜ ๊ฐœ์ธ์šฉ ์‚ฌ๋ณธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋‚ด node_modules ํŠธ๋ฆฌ์—์„œ rxjs์˜ ๋„ค ๊ฐ€์ง€ ๋ณต์‚ฌ๋ณธ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ณ„์†ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ์ ‘๊ทผ ๋ฐฉ์‹ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์˜ ์ •์ฒด์„ฑ์— ์–ด๋–ค ์—ญํ• ์„ํ•˜๋˜ ํŒŒ์ผ ์ด๋ฆ„์˜ ์ „์ฒด ๊ฐœ๋…์ด ์‚ฌ๋ผ์ง€๋ฉด์ด npm ๋งํฌ ๋ฌธ์ œ๋„ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค ... ์ €๋Š” TypeScript๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ๋ฐ›๊ณ ์žˆ๋Š” ์ธ์ƒ์ž…๋‹ˆ๋‹ค.์ด "ํŒŒ์ผ ์ด๋ฆ„์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ๊ฒƒ์ด ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (ionic2, angular2 ๋ฐ rxjs)์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฝค ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์ด ์—ฌ์ „ํžˆ Javascript์—์„œ ๋ชจ๋“ˆ์˜ ID์ด๋ฏ€๋กœ ์™„์ „ํžˆ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€ ๋ฒ„์ „๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ‘œ์ค€ ๊ฒฝ๋กœ (์‹ฌ๋ณผ ๋งํฌ ํ•ด๊ฒฐ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŠธ๋ฆฌ ๋‚ด์— ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด์žˆ๋Š” ๊ฒฝ์šฐ ํ‘œ์ค€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๊ฒŒ์‹œ ํ›„ ์ด๊ฒƒ์„ ๊นจ๋‹ฌ์•˜ ์œผ๋ฉฐ์ด ์˜๊ฒฌ์€ ์ž˜ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.
https://github.com/Microsoft/TypeScript/issues/6496#issuecomment -257016094

exclude ๋ฐ compilerOptions.typeRoots ๋Š” tsc์—์„œ ์™„์ „ํžˆ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋œ ๊ฒฝ๋กœ๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์กฐํ•ฉ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ
์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ œ์™ธ ๋œ ํŒจํ„ด์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋“ˆ์„ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด G:\www\cim-service-locator npm์ด npm link cim-service-locator ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. G:\www\cim-backend ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ์— ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

crop

๋‚˜๋Š” excludes / includes / typesRoot์˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ tsc๊ฐ€ ๊ทธ๋“ค์„ ๋ฌด์‹œํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. 2.2-dev.20170131 ์‚ฌ์šฉ

์ด ๋ฌธ์ œ๋Š” "npm ๋งํฌ"(@waldekmastykarz๊ฐ€๋ณด๊ณ  ํ•œ SPFx ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด)์™€ "npm ๋งํฌ"(๋ฒ„๊ทธ # 11436 ์ฐธ์กฐ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์—„๊ฒฉํ•จ์€ node_modules ํด๋”์˜ ์—‰๋šฑํ•œ ๋””์ž์ธ์œผ๋กœ ์ธํ•ด ํ˜„์‹ค์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋น„ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

+---B<strong i="8">@1</strong>
+---C
|   +---B<strong i="9">@2</strong>   <--- first copy of ClassB extends ClassE version 3.4
|   \[email protected]
+---D
|   \---B<strong i="10">@2</strong>   <--- second copy of ClassB extends ClassE version 3.5
\[email protected]

์ด ์˜ˆ์—์„œ B @ 1 ์— ๋Œ€ํ•œ A ์˜ ์ข…์†์„ฑ๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก B @ 2 ๋ฅผ ํ•˜์œ„ ํด๋”์— ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ClassB๊ฐ€ ClassE์—์„œ ํ™•์žฅ๋˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

B / package.json

{
  "name": "B",
  "version": "2.0.0",
  "dependencies": {
    "E": "^3.0.0",
    ...
}

C์˜ package.json๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ [email protected] ๋‹ค์Œ ClassB๊ฐ€ ๋‘ ๋ณต์‚ฌ๋ณธ ์‹ค์ œ๋กœ ์–‘๋ฆฝ ์ฆ‰, ๋‹ค๋ฅธ ๊ธฐ๋ณธ ํด๋ž˜์Šค ๊ตฌํ˜„์„ ๋๋‚ผ ์ˆ˜์žˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์„œ๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ์ฝ”๋“œ๊ฐ€ ์‹คํŒจ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ TS2345๋Š” ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ํ•„์ˆ˜์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‘ ๊ฐœ์˜ ClassB ๋ณต์‚ฌ๋ณธ์„ ๋™๋“ฑํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์œ ํ˜• ์‹œ์Šคํ…œ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚ด๋ถ€์ ์œผ๋กœ ์ผ๊ด€๋˜๊ณ  ๊ฒฐ์ •์  ๋™์ž‘์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์ด๋Š” TS2345๊ฐ€ ๋Œ€๋ถ€๋ถ„ ์ž˜๋ชป๋œ ๊ฒฝ๋ณด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž˜๋ชป๋œ ๊ฒฝ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์ด NPM ํŒจํ‚ค์ง€๊ฐ„์— ์œ ํ˜•์„ ๊ณต์œ  ํ•  ๋•Œ๋งˆ๋‹ค "์ž„์˜๋กœ"์ž‘์„ฑํ•˜๋„๋กํ•˜์—ฌ ๋‹ค๋ฅธ ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—„๊ฒฉํ•จ์€ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ฐธ์ด๋ฉด ๋น„๊ณต๊ฐœ ๋ฉค๋ฒ„๊ฐ€์žˆ๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด TS2345๋ฅผ๋ณด๊ณ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

  1. ๊ณต์šฉ ์„œ๋ช…์€ ์ผ๋ฐ˜์ ์ธ TypeScript ๋• ํƒ€์ดํ•‘์— ๋”ฐ๋ผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  2. ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ๋ฒ„์ „์œผ๋กœ NPM ํŒจํ‚ค์ง€ ํด๋”์— ์ •์˜๋ฉ๋‹ˆ๋‹ค (package.json์— ๋”ฐ๋ฆ„).
  3. ํด๋ž˜์Šค๋Š” ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค (์˜ˆ : "./lib/blah/Bdts").

์ด๋Ÿฌํ•œ ๊ธฐ์ค€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด TS2345๋ฅผ๋ณด๊ณ ํ•ด๋„๋ฉ๋‹ˆ๋‹ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

@seansfkelley Webpack ์˜ค๋ฅ˜๋Š” TypeStrong / ts-loader # 468์— ์˜ํ•ด ์ถ”์ ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,
๋ˆ„๊ตฐ๊ฐ€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?
RxJS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐํ•  ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ;)

์•ˆ๋…•ํ•˜์„ธ์š”, ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ข…์†์„ฑ์— ์˜ํ•ด ๋ฐ˜ํ™˜ ๋œ Observable์„ Observable#from ๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ง ํ•ด๊ฒฐ์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค. ?

์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ts-loader ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘๋ณต ์ •์˜์— ๋Œ€ํ•ด ์ž˜๋ชป๋œ ์˜ค๋ฅ˜๋ฅผ๋ฐ›๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ API์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ž…๋ ฅ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ˆ˜์ •์€ TypeStrong / ts-loader # 468์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋™์ผํ•œ ํŒจํ‚ค์ง€ (๋™์ผํ•œ npm ํŒจํ‚ค์ง€ + ๋ฒ„์ „)๊ฐ€ ๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ ๋œ ํด๋”์— ๋กœ์ปฌ๋กœ ๋‘ ๋ฒˆ ์„ค์น˜๋œ ๊ฒฝ์šฐ ( npm link ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ), Enum ๋˜๋Š” ๊ฐœ์ธ ๋ฉค๋ฒ„๊ฐ€์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ด ๋‘ ํŒจํ‚ค์ง€์˜ ์œ ํ˜•์€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ์ข€ ๋” ๋ณต์žกํ•˜๋ฉฐ ํŒจํ‚ค์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํŒจํ‚ค์ง€๋ฅผ "์ค‘๋ณต ์ œ๊ฑฐ"ํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๋ฒ”์ฃผ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ˜„์ง€์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๋ฉด ์ž์„ธํžˆ ์กฐ์‚ฌํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

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

Rush (์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”)์™€ Lerna ๊ฐ€ ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

@smcatala ์†”๋ฃจ์…˜์„ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธ‰ํ•˜๊ฒŒ ๊ณ ์ณ์•ผ ํ•ด์š”. ๊ฐ์‚ฌ.

ํ—‰ํ—‰
๋ชจ๋“ˆ 'foo':

import { Observable } from 'rxjs'
export function foo() {
  return Observable.of('foo')
}

๋ชจ๋“ˆ 'foo'์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ :

import { Observable } from 'rxjs'
import { foo } from 'foo'

Observable.of(foo()) // wrap the returned Observable
.forEach(res => console.log(res))

@ leovo2708 ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ npm link ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ts 2.1์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ npm ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ (์‹ค์ œ ์˜ˆ์ธ xlib ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค) ๋ชจ๋“ˆ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ( xlib ์ธ์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์€ ๋‹ค์Œ ์›Œํฌ ํ”Œ๋กœ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. node_modules ์‚ญ์ œ
  2. npm link xlib ๋‚ด ์†Œ๋น„ ํ”„๋กœ์ ํŠธ์˜ node_modules ์—์„œ xlib ์— ๋Œ€ํ•œ sym_link๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‚ด ์†Œ๋น„ ํ”„๋กœ์ ํŠธ์˜ ๋‚˜๋จธ์ง€ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๋Š” npm install

๋‚˜๋Š” ์‹ค์ œ๋กœ์ด ๋Œ€ํ™”๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์•˜ ๊ฑฐ๋‚˜์ด ๋ฌธ์ œ๊ฐ€ 2.2 ์ดํ›„ ๋ณ€๊ฒฝ / ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ TS 2.1์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์— ์—ด๊ฑฐ ํ˜• ์ผ€์ด์Šค์˜ ์—ฌ๋Ÿฌ ์ •์˜์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ์žฌํ˜„์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค : https://github.com/rictic/repro-npm-link-typescript-issue

@mhegazy npm ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ๋‚˜๋จธ์ง€ ๋ถ„์„์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ณง ์ˆ˜์ •๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Observable์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณต์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข‹์ง€๋Š” ์•Š์ง€๋งŒ ์ž„์‹œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

tsconfig.json ๋Š” ๊ฒฝ๋กœ ๋งคํ•‘์„ ๋…ธ์ถœํ•˜๊ณ  ์ค‘๋ณต ๋œ ์ข…์†์„ฑ์„ paths ์— ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์—ฐ๊ฒฐ๋œ ํ•ญ๋ชฉ์ด ์•„๋‹Œ ์˜ค๋ฅธ์ชฝ node_modules ์—์„œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

{
  "compilerOptions": {
    "baseUrl": ".", // This must be specified if "paths" is.
    "paths": {
      "@angular/common": ["../node_modules/@angular/common"],
      "@angular/compiler": ["../node_modules/@angular/compiler"],
      "@angular/core": ["../node_modules/@angular/core"],
      "@angular/forms": ["../node_modules/@angular/forms"],
      "@angular/platform-browser": ["../node_modules/@angular/platform-browser"],
      "@angular/platform-browser-dynamic": ["../node_modules/@angular/platform-browser-dynamic"],
      "@angular/router": ["../node_modules/@angular/router"],
      "@angular/http": ["../node_modules/@angular/http"],
      "rxjs/Observable": ["../node_modules/rxjs/Observable"]
    }
  }
}

์—ฌ๊ธฐ์— ์ด๋ฏธ ์–ธ๊ธ‰๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ์ด ์†”๋ฃจ์…˜์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/issues/11916#issuecomment -257130001

๊ฒฝ๋กœ์— "../"์ ‘๋‘์‚ฌ๊ฐ€์—†๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์˜ @charpeni ์˜ ์†”๋ฃจ์…˜๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ tsconfig.json ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ ํ•˜์œ„ ํด๋”์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.)

@charpeni ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๋กœ ์„ค์ •์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์—๋„ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์†Œ๋น„ ํ”„๋กœ์ ํŠธ์—์„œ ์˜ฌ๋ฐ”๋ฅธ paths ์„ค์ •์ด (์†Œ๋น„๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹Œ) TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹ค์Œ ๋…ธ๋“œ ํ•ด์ƒ๋„์—์„œ ๋ฉ€์–ด ์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•œ๋‹ค๋ฉด O (n) ํ•ดํ‚น ๋Œ€์‹  O (1) ํ•ดํ‚น์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ฒด๊ณ„๋Š” ๋…ธ๋“œ ํ™•์ธ์„ ์ •์ ์œผ๋กœ ์‹คํ–‰ ํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ tsconfig์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€๋ณด๊ณ  ์‹ถ๊ฑฐ๋‚˜ ๋„์™€์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐ˜ ๊ณต๊ฐœ์ ์œผ๋กœ ์‹คํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์œ„์˜ ์•„์ด๋””์–ด๋ฅผ ์‹œ๋„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/OasisDigital/many-to-many-angular

๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        "baseUrl": ".", // This must be specified if "paths" is.
        "paths": {
            "@angular/*": ["../node_modules/@angular/*"],
            "rxjs/*": ["../node_modules/rxjs/*"]
        }
    }
}

npm ๋งํฌ๋Š” ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋กœ ์ž‘์—… ํ•  ๋•Œ ์›Œํฌ ํ”Œ๋กœ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. TS๋Š” ๋‘ ํŒจํ‚ค์ง€๊ฐ€ ๋™์ผํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹˜์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@charpeni ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค tsconfig.json์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋ฃจํŠธ ํŒจํ‚ค์ง€ ๋˜๋Š” ๋งํฌ ๋œ ํŒจํ‚ค์ง€?

์ด ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์›”์š”์ผ์— ๊ฐ‘์ž๊ธฐ ์ผ์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ๊ทธ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠนํžˆ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ์œ„ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐœ๋ฐœ์„ ์ •๋ง๋กœ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. Windows์—์„œ mklink /j ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ npm ๋งํฌ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

Btw,์ด ๋ฌธ์ œ๋Š” @types ์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ glob ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

@felixfbecker ๊ตฌํ˜„์„ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/sherweb/ng2-materialize/blob/master/demo-app/tsconfig.json#L19 -L22

@ types / node์™€ ์™„์ „ํžˆ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

libA๋Š” @ node / types์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
libB๋Š” libA ๋ฐ @ node / types์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
libC๋Š” libA, libB ๋ฐ @ node / types์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

libA๋Š” ์ž˜ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.
libA ๋นŒ๋“œ ํŒŒ์ผ์— ์—ฐ๊ฒฐ๋œ libB npm.
libA ๋ฐ libB์— ์—ฐ๊ฒฐ๋œ libC npm์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋กœ ์œ ํ˜• ๊ฒ€์‚ฌ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

libC/node_modules/@types/node/index.d.ts(102,6): Duplicate identifier 'BufferEncoding'.
libC/node_modules/libB/node_modules/@types/node/index.d.ts(102,6): Duplicate identifier 'BufferEncoding'.
libC/node_modules/libB/node_modules/libA/node_modules/@types/node/index.d.ts(102,6): Duplicate identifier 'BufferEncoding'.

๋‚˜๋Š” ์šด์ด์—†์ด "types"์™€ "typeRoots"๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๋ ค๊ณ ํ–ˆ๋‹ค.

@charpeni ํ”„๋กœ์ ํŠธ๋„ @ types / node์— ์˜์กดํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด๋‚˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@nicksnyder ๋Š” ๋ฒ„์ „์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ @types/node ๋Š” ์ „์—ญ ์„ ์–ธ์ด๋ฏ€๋กœ ๋™์ผํ•œ ์ด๋ฆ„์„ ๋‘ ๋ฒˆ ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํŒจํ‚ค์ง€๊ฐ€ ํ™˜๊ฒฝ ์œ ํ˜•์— ์˜์กดํ•˜์ง€ _ ์•Š๋Š” _ ๊ฐ€์žฅ ์ข‹์€ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
https://github.com/Microsoft/types-publisher/issues/107

@nicksnyder ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  npm์ด ์„ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋‘ ๋‹จ์ผ @ types / node ์„ค์น˜์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ •์˜๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์— ์ •์˜๋˜๋ฏ€๋กœ ๋” ์ด์ƒ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@felixfbecker ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๊ฐ€ ๋™์ผํ•œ ๋ฒ„์ „์˜ ๋…ธ๋“œ์— ์˜์กดํ•˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

FWIW libA๋Š” https://github.com/Microsoft/vscode-languageserver-node/tree/master/jsonrpc , libB๋Š” https://github.com/Microsoft/vscode-languageserver-node/tree/master/client ๋ฐ libC์ž…๋‹ˆ๋‹ค. ๋‚ด ์ž์‹ ์˜ VS ์ฝ”๋“œ ํ™•์žฅ์ž…๋‹ˆ๋‹ค.

@uncleramsay ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ npm link @types/node ํ–ˆ์Šต๋‹ˆ๊นŒ?

???
cd libA; npm link @types/node
cd libB; npm link @types/node
cd libC; npm link @types/node

๋งํฌ ์†”๋ฃจ์…˜์„ํ•˜๊ณ  ์‹ถ์ง€๋งŒ libA ๋ฐ libB์—์„œ @ types / node ์ข…์†์„ฑ์„ ์‚ญ์ œํ•˜๊ณ  libC์˜ ๋…ธ๋“œ ๋ณต์‚ฌ๋ณธ์— ๋Œ€ํ•œ ๋กœ์ปฌ ์ฐธ์กฐ๋ฅผ ํฌํ•จํ•˜๋Š” refs.d.ts๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

/// <reference path='../../../path/to/libC/node_modules/@types/node/index.d.ts'/>

https://github.com/Microsoft/TypeScript/issues/9091#issuecomment -225303098์˜ ์„ค๋ช…์—์žˆ๋Š” ์„ค๋ช…์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ํ•ด๊ฒฐ ์ง€์› ๋งŒ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ฐธ์กฐ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋ณ„๋„ ์œ„์น˜ :

/// <reference path="../node_modules/@types/library" />
/// <reference types="library" />

์ด ๋‘ ๊ฐ€์ง€๋Š” node_modules๊ฐ€ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋œ ๊ฒฝ์šฐ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ํ™•์ธ ( types= )์ด ์‹ค์ œ ๊ฒฝ๋กœ๋กœ ํ™•์žฅ๋˜์ง€๋งŒ path= ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด tsc --listFiles , symlink ๋ฐ realpath๋กœ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์ฐธ์กฐ๋˜๋Š” ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ํ–ˆ๋˜ ํ•ด๊ฒฐ์ฑ…์€ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์ง€๋งŒ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ reference path= ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ node_modules/@types ์—์„œ ์œ ํ˜•์„ ์ž๋™์œผ๋กœ๋กœ๋“œํ•˜์ง€ ์•Š๋„๋ก tsconfig์— typeRoots: [] ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•ž์œผ๋กœ์˜ ์„ ํ˜ธ๊ฐ€ (์ ์–ด๋„ ์šฐ๋ฆฌ์—๊ฒŒ) types= ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ƒ์ ์œผ๋กœ๋Š” reference path= ์—์„œ ์‹ค์ œ ๊ฒฝ๋กœ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ์„ ํ˜ธ๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๋ณต ์ผ์น˜ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@nicksnyder ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

cd libA/node_modules/@types/node; npm link
cd libB; npm link @types/node
cd libC; npm link @types/node

์ด๋ ‡๊ฒŒํ•˜๋ฉด B์™€ C๋Š” A์™€ ๋˜‘๊ฐ™์€ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.

@uncleramsay๋Š” ์ด์ „์— ์—†์—ˆ๋˜ ๋ชจ๋“  ๋ฒ„์ „์ด ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ผ์–ด ์ข…์†์„ฑ์ด ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?
http://codetunnel.io/you-can-finally-npm-link-packages-that-contain-peer-dependencies/

ํ”ผ์–ด ์˜์กด์„ฑ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ฌด์Šจ ์ผ์„ํ•˜๋Š”์ง€ ๋งํ•˜๊ณ ์žํ•˜๋Š” ์ƒํ™ฉ์„ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ทธ ์‚ฌ๊ฑด์— ๋Œ€ํ•ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด "npm install"์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ข…์†์„ฑ์„ ํ”ผ์–ด ์ข…์†์„ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‚ด๋ถ€ git repos์—์„œ ๊ทธ๋“ค์„ ์ถ”๋ฐฉํ•˜๋Š” ๋ฐ ๋ช‡ ๋‹ฌ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ”ผ์–ด ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์™€ ๊ฑฐ๋ž˜ํ•˜์—ฌ ๋ณ‘๋ ฌ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ „์ฒด ํŠธ๋ฆฌ๊ฐ€ ๋ฐ˜์ „๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ œ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๊ฐ„์ ‘ ์ข…์†์„ฑ์ด์—ˆ๋˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ํ•˜๋“œ ์ข…์†์„ฑ์„ ๋‹ด๋‹นํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

  • ํ”ผ์–ด ์ข…์†์„ฑ์ด ์ œ๊ฑฐ๋˜๋ฉด ์ด๋Ÿฌํ•œ ํ•˜๋“œ ์ข…์†์„ฑ์€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ž˜ํ–ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ ๊ฐ€์ง€ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ต์…˜ 1 : Visual Studio๊ฐ€ ์•„๋‹Œ vscode ์‚ฌ์šฉ

tsc ์ปดํŒŒ์ผ๋Ÿฌ๋Š” VS2017๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ด€๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ VS2017์ด ๋ฉ‹์ง„ ์ง€๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ (์‹ฌ๋ณผ ๋งํฌ ๋œ node_modules )๋ฅผ ํฌ๋กค๋งํ•˜์—ฌ ํ˜ผ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ํฌ๊ณ  ๋ณต์žกํ•œ ๋‹ค์ค‘ npm ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ VS2017์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค ... ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋น„์Šทํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์˜ต์…˜ 2์™€ 3์„ ์ฝ์œผ์‹ญ์‹œ์˜ค ....

์˜ต์…˜ 2 : d.ts ๋ฐฉ์ถœ

outDir ๋ฐ rootDir ( tsconfig.json )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋œ lib-module์€ d.ts ์„ ์–ธ์„ ๋‚ด ๋ณด๋‚ด์•ผํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ์„ ์–ธ์€ lib-module์˜ package.json types ์†์„ฑ.

๋‹ค์Œ์€ lib-module์˜ tsconfig.json ์˜ˆ์ž…๋‹ˆ๋‹ค.

{
  "compileOnSave": true,
  "compilerOptions": {
    "module": "commonjs",
    "sourceMap": true,
     "declaration": true,
    "jsx": "react",
    "newLine": "LF",
    "pretty": true,
    "stripInternal": true,
    "diagnostics": true,
    "target": "es5",
    "moduleResolution": "node",
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist",
    "rootDir": "./src",
   //workaround for npm linking projects and associated dupe identifier bugs: https://github.com/Microsoft/TypeScript/issues/9566#issuecomment-287633339
    "baseUrl": "./",
    "paths": {
      "*": [
        "node_modules/@types/*",
        "*",
        "custom-dts/*"
      ]
    }
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "dist"
  ]
}

lib ๋ชจ๋“ˆ์˜ package.json ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  "main": "./dist/_index.js",
  "types": "./dist/_index.d.ts",

์ด ์˜ต์…˜์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋œ ๋ฌธ์ œ๋Š” Visual Studio์—์„œ ๋””๋ฒ„๊น… ๋˜๋Š” "์ •์˜๋กœ ์ด๋™"๋˜๋Š” "๋ชจ๋“  ์ฐธ์กฐ ํ‘œ์‹œ"์‹œ ์‹ค์ œ typescript ์†Œ์Šค ํŒŒ์ผ์ด ์•„๋‹Œ d.ts ๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ Visual Studio์˜ ์ฃผ์š” ์ด์  (๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ํƒ์ƒ‰)

์‹ค์ œ ์˜ˆ์ œ๋ฅผ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด npm ๋ชจ๋“ˆ xlib v8.5.x๋ฅผ๋ณด์‹ญ์‹œ์˜ค.

์˜ต์…˜ 3 : ์†Œ์Šค์™€ ํ•จ๊ป˜ .js ์ธ๋ผ์ธ ๋ฐฉ์ถœ (๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์„ ํƒ)

.ts ํŒŒ์ผ์„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋œ lib-modules์— ์ง์ ‘ ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ outDir`` and rootDir in your tsconfig.json''` ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด VS2017 ์ฐธ์กฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "compileOnSave": true,
  "compilerOptions": {
    "module": "commonjs",
    "sourceMap": true,
     //"declaration": true,
    "jsx": "react",
    "newLine": "LF",
    "pretty": true,
    "stripInternal": true,
    "diagnostics": true,
    "target": "es5",
    "moduleResolution": "node",
    "forceConsistentCasingInFileNames": true,
    //"outDir": "./dist",
    //"rootDir": "./src",
   //workaround for npm linking projects and associated dupe identifier bugs: https://github.com/Microsoft/TypeScript/issues/9566#issuecomment-287633339
    "baseUrl": "./",
    "paths": {
      "*": [
        "node_modules/@types/*",
        "*",
        "custom-dts/*"
      ]
    }
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules",
    "dist"
  ]
}

lib-module์˜ package.json ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  "main": "./src/_index.js",
  "types": "./src/_index.ts",

์ฃผ์˜ ์‚ฌํ•ญ (์˜ต์…˜ 3์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌํ•ญ

๊ฐ LIB ๋ชจ๋“ˆ์ด ์ค‘๋ณต ์œ ํ˜• ์ •๋ณด๋ฅผ ๋ฐฉ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์œ„์˜ ํ•ด๊ฒฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, xlib ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ @types/async ์œ ํ˜• ์ •์˜๋ฅผ ๋…ธ์ถœํ•˜๋„๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋…๋ฆฝ์ ์œผ๋กœ @types/async ์ฐธ์กฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. .ts ํŒŒ์ผ์„ ์ง์ ‘ ์ž…๋ ฅ์— ์‚ฌ์šฉํ•˜๋ฉด tsc ๊ฐ€ ๋‘ ๊ฐœ์˜ lib-module์—์„œ async ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ duplicate identifier ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ lib-module์—์„œ ๋™์ผํ•œ @types ๋ฅผ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๊ฑฐ๋‚˜ ์˜ต์…˜ 2 .d.ts ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

์ด๊ฒƒ์ด ์ €์—๊ฒŒ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ์ ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค .... ์ „๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋งค์šฐ ๊ณ ํ†ต์Šค๋Ÿฝ๊ณ  typescript ํŒ€์ด symlinked ๋ชจ๋“ˆ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ ์ง€๊ธˆ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (2.x ์ด์ „์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค)

@mhegazy ๊ฐ€ https://github.com/Microsoft/TypeScript/issues/11916#issuecomment -257130001 ์— ๊ฒŒ์‹œ ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2 @jasonswearingen์˜ ๋ณ€ํ˜•)์€ lerna ํ”„๋กœ์ ํŠธ์—์„œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค!

์ €๋Š” ์ œ ๊ฒฝํ—˜์„ ๊ณต์œ  ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—์„œ lib๋ฅผ ์ƒ์„ฑ / ์ถ”์ถœํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ lib๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ๋„๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

Windows 10 Enterprise
VS 2015 ์—…๋ฐ์ดํŠธ 3
VS2015 2.2.2 ์šฉ ๋„๊ตฌ
VS ์ฝ”๋“œ 1.12.2
ํƒ€์ดํ”„ ์Šคํฌ๋ฆฝํŠธ 2.2.2
NPM : 3.10.9
๋…ธ๋“œ : 6.9.2

Angular 4.1.x ํ”„๋ŸฐํŠธ ์—”๋“œ๊ฐ€์žˆ๋Š” VS 2015 ASP.MVC ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ, ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” VS Code๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋˜๊ณ  ๋กค์—…์„ ์‚ฌ์šฉํ•˜์—ฌ es2015, es5 ๋ฐ umd ๋ฒ„์ „์„ ์ ์ ˆํ•œ d.ts ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ dist ํด๋”์— ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

-- dist
    |
    -- mylib
        |-- <strong i="16">@myscope</strong>
            |-- mylib.es5.js
            |-- mylib.js
        |-- bundles
            |-- mylib.umd.js
        |-- src
            |-- [all the d.ts folders/files]
        |-- index.d.ts
        |-- package.json
        |-- public_api.d.ts

npm์€ dist / mylib ํด๋”๋ฅผ VS 2015 / Angular 4.1.x ํ”„๋กœ์ ํŠธ์˜ ํด๋”์— ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

VS 2015์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ ํ•˜๋ฉด ๊ตฌ๋…, Observable ๋“ฑ์— ๋Œ€ํ•ด ์œ„์˜ ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์œ ํ˜•์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Ex: Build: Argument of type 'Subscription' is not assignable to parameter of type 'Subscription'.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋ฉด ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ex: Build: Cannot find module 'rxjs/Observable'.

๋”ฐ๋ผ์„œ typescript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์‹ค์ œ๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ node_modules ํด๋”๊ฐ€ ์•„๋‹Œ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ ์ •์˜์— ๋Œ€ํ•œ ๋งํฌ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€์˜ node_modules ํด๋”๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์œ„์— ์ œ์•ˆ ๋œ ์†”๋ฃจ์…˜์ด์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ํ•  ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ œ๋ฐœ ๋„์™€ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ!

@mikehutter ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๊ฐ€ ์•„๋‹˜)์—์„œ tsconfig์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•˜์‹ญ์‹œ์˜ค.

    "paths": {
      "rxjs/*": ["../node_modules/rxjs/*"]
    },

tsconfig ๋ฐ ์†Œ์Šค ์ฝ”๋“œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์•ฝ๊ฐ„์˜ ์กฐ์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•„์ž๋Š” ์ด๊ฒƒ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” TypeScript ๊ฐœ์„ ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.)

@mikehutter ์ตœ๊ทผ ๋งํฌ ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์—…์— ๋Œ€ํ•œ Angular CLI์— ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ ์†Œ๋น„์ž ์•ฑ์—์„œ RxJ์— ๋Œ€ํ•œ TypeScript ๊ฒฝ๋กœ ๊ตฌ์„ฑ์ด ๋ˆ„๋ฝ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/linked-library.md ๋ฅผ ์ฐธ์กฐ

@kylecordes ๊ฐ€ ํฌ์ธํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

@kylecordes ์™€ @filipesilva์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ์ „๋ถ€ ์˜€์–ด ...

์•ˆ๋…•ํ•˜์„ธ์š”!

@mhegazy , ์ด๊ฒƒ์ด 2.4๋กœ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋‹ค์‹œ ์ง€์—ฐ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๊นŒ?
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์ ํŠธ๋Š” ํ•ญ์ƒ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ๋งคํ•‘์„ ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์ด ์ถœ์‹œ๋˜๊ธฐ๋ฅผ ์ •๋ง ๋ฐ”๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๋ฒ ์ŠคํŠธ,

์ด๊ฒƒ์ด ์•„์ง ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "*": ["node_modules/*", "*"]
        }
    }
}

์œ„์˜ paths ํ•ญ๋ชฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋จผ์ € ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ node_modules ํด๋”์—์„œ ์ฐพ์€ ๋‹ค์Œ ์ผ๋ฐ˜ ๊ทœ์น™์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค (์žฌ๊ท€ ์ ์œผ๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค).

(๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ๋‚˜๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ TS์— ์ƒ๋Œ€์ ์œผ๋กœ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค).

์˜ ํ•ญ๋ชฉ paths ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค๊ฐ€๋ฅผ ๊ธฐ์ค€์— baseUrl . ๋”ฐ๋ผ์„œ baseUrl ๋ฅผ ํ•˜์œ„ ํด๋”๋กœ ์„ค์ •ํ•˜๋ฉด ๊ทธ์— ๋”ฐ๋ผ ๊ฒฝ๋กœ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ :

{
    "compilerOptions": {
        "baseUrl": "./src",
        "paths": {
            "*": ["../node_modules/*", "*"]
        }
    }
}

๋‚ด ๋Œ€์•ˆ ์˜ต์…˜ 2์™€ 3์˜ ์ผ๋ถ€์ธ @fiznool fyi (์œ„ ๊ฒŒ์‹œ๋ฌผ์—์„œ). ๋™์ผํ•œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๋œ ํ”„๋กœ์ ํŠธ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ paths ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

@jasonswearingen ๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์€ ๋‚ด ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํฌ๊ด„์ ์ž…๋‹ˆ๋‹ค ...

Google ํ”„๋กœ์ ํŠธ์—์„œ๋„์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ๋Œ€๋กœ :
https://github.com/Microsoft/TypeScript/issues/9091#issuecomment -306969543

baseUrl ๋ฐ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์—์„œ ์„ค๋ช…ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ tsc๋Š” ์—ฌ์ „ํžˆ ์ค‘๋ณต ์ •์˜๋ฅผ ์„ ํƒํ•˜๊ณ  paths / baseUrl / include / exclude / etc์˜ ์กฐํ•ฉ์„ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์„ค๋“ ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

X์— ์˜์กดํ•˜๊ณ  ์ „ ์ด์ ์œผ๋กœ X์— ์˜์กดํ•˜๋Š” Y์— ์˜์กดํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ tsc๊ฐ€ ํƒ€์ž… ์ •์˜๋ฅผ ๋‘ ๋ฒˆ๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@esprehn ์—ฌ๊ธฐ์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์„ ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค : https://github.com/Microsoft/TypeScript/issues/6496#issuecomment -302886203

ํ•ด๋‹น ๋งํฌ์™€ ๊ด€๋ จํ•˜์—ฌ ๋‚ด ์†”๋ฃจ์…˜ (2 ๋ฐ 3) ๋ชจ๋‘ baseUrl ๋ฐ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ ์ด์ƒ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ทธ๊ฒŒ ์ „๋ถ€๋ผ๋ฉด ๋‹ค์‹œ ์ฝ์œผ์‹ญ์‹œ์˜ค. "์‰ฌ์šด"๋ฐฉ๋ฒ•์€ ์†”๋ฃจ์…˜ 2์ด์ง€๋งŒ, Visual Studio๋ฅผ ํ†ตํ•ด ์ ์ ˆํ•œ "์ •์˜ ํƒ์ƒ‰"์„ ํ—ˆ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜ 3์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜ 3์˜ ๋ฌธ์ œ๋Š” ์ข…์†์„ฑ ์ฒด์ธ์—์„œ ์™ธ๋ถ€ .d.ts ์ •์˜๋ฅผ ํ•œ ๋ฒˆ๋งŒ๋กœ๋“œํ•˜๋ฉด๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

+1 lerna๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํฌํ•จ ๋œ ํƒ€์ดํ•‘์ด์žˆ๋Š” ํ•˜์œ„ ์ข…์†์„ฑ์€ ์—ฐ๊ฒฐ๋œ ์ข…์†์„ฑ์„ ํ†ตํ•ด ํฌํ•จ ๋œ ๊ฒฝ์šฐ "์ค‘๋ณต"ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Angular-CLI์—์„œ์™€ ๊ฐ™์ด WebPack์„ ์‚ฌ์šฉํ•˜์—ฌ Angular-CLI package.json์ด RXJS ํŒจํ‚ค์ง€๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•œ ๋‹ค์Œ WebPack์œผ๋กœ ์ธํ•ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ package.json์—์„œ`RXJS 'ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. .

์ด ์ƒํ™ฉ์€ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ dependencies @types/node ์™€ ์ข…์†์„ฑ์˜ npm-shrinkwrap.json ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Shrinkwrap์€ npm ๊ฐ€ @types/node ์˜ ๋™์ผํ•œ ๋‘ ๋ฒ„์ „์„ ๋ถ€๋ชจ ํŒจํ‚ค์ง€์™€ ์ˆ˜์ถ• ํฌ์žฅ ํŒจํ‚ค์ง€์— ์„ค์น˜ํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค. https://github.com/KingHenne/custom-tslint-formatters/issues/5๋ฅผ ์ฐธ์กฐ

@types/react ์„ค์น˜๋œ ๋ฐ˜์‘ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  @types/react ๋„ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์— ์—ฐ๊ฒฐํ•  ๋•Œ๋„์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

yarn link -ed ํŒจํ‚ค์ง€๋กœ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
Rx.js ์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ : Type 'Observable<Location[]>' is not assignable to type 'Observable<Location[]>'. Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'

๋‹คํ–‰ํžˆ ๋ถ€๋ชจ ๋ฐ ์—ฐ๊ฒฐ๋œ ํŒจํ‚ค์ง€์—์„œ ๋™์ผํ•œ Rxj.s ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ œ ๊ฒฝ์šฐ์—๋Š” Rx.js ์˜ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ monorepos๋กœ ์ž‘์—… ํ•  ๋•Œ ํฐ ์ฐจ๋‹จ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋” ์ด์ƒ ์ง€์—ฐ๋˜์ง€ ์•Š๊ณ  2.5๋กœ๊ฐ€๋Š” ๊ธธ์„ ์ฐพ๊ธฐ๋ฅผ ์ •๋ง๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๐Ÿ˜ฎ

image

ํฅ๋ฏธ ๋กญ๊ตฐ. monorepo ๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ๊ณตํ†ต ํŒจํ‚ค์ง€ ํด๋”๋กœ ๊ฐ€๋ฆฌ ํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ํŒ€์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํŒ€์€ ๊ฐœ๋ฐœ ์ค‘์— ์ž์ฒด ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ์ด ๋ฌธ์ œ๋ฅผ ์ž์ฃผ ๋ฐœ์ƒ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์ •๋ง ์ž˜ ์™„ํ™”ํ•˜๊ณ  ์‹ค์ œ๋กœ ๊ฝค ์ข‹์€ ๊ฐœ๋ฐœ ๋ฃจํ”„๋ฅผ ๋งŒ๋“œ๋Š” yalc ๋ผ๋Š” ๋„๊ตฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. (์ „์ฒด ํŒจํ‚ค์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์‹  tl; dr๋กœ ์‚ฌ์ „ ๊ฒŒ์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์—ฐ๊ฒฐ๋œ ํด๋”์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.)

์ด ๋ฌธ์ œ๋Š” ๊ณ„์†ํ•ด์„œ ๋ฐ€๋ ค๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ •๋ง ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ์›Œํฌ ํ”Œ๋กœ์— ์ง€์žฅ์„์ฃผ๊ธฐ ๋•Œ๋ฌธ์— # 9448์—์„œ ์ œ์•ˆํ•œ '์ฝ”๋ฉ˜ํŠธ ๋น„ํ™œ์„ฑํ™”'์™€ ๊ฐ™์€ ์ผ์ข…์˜ ์ž„์‹œ ๋ฐฉํŽธ ์ˆ˜์ •์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

import { baz$ } from './qux';
function foo (bar$: Observable<any>) {}

foo(baz$);
> Duplicate identifier

// Makes foo's `bar$` type equal to that of `baz$`
foo(/*typescript:identicalIdentifier*/ baz$);

"disable comment"๋Š” ๋‹จ์ˆœํžˆ ๋ชจ๋“  ๊ณณ์—์„œ ํƒ€์ž… ์บ์ŠคํŠธ๋ฅผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋งค์šฐ ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ฐธ์ด๋ฉด ๋น„๊ณต๊ฐœ ๋ฉค๋ฒ„๊ฐ€์žˆ๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด TS2345๋ฅผ๋ณด๊ณ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

  1. ๊ณต์šฉ ์„œ๋ช…์€ ์ผ๋ฐ˜์ ์ธ TypeScript ๋• ํƒ€์ดํ•‘์— ๋”ฐ๋ผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  2. ํด๋ž˜์Šค๋Š” ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ๋ฒ„์ „์œผ๋กœ NPM ํŒจํ‚ค์ง€ ํด๋”์— ์ •์˜๋ฉ๋‹ˆ๋‹ค (package.json์— ๋”ฐ๋ฆ„).
  3. ํด๋ž˜์Šค๋Š” ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค (์˜ˆ : "./lib/blah/Bdts").

์ด๋Ÿฌํ•œ ๊ธฐ์ค€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด TS2345๋ฅผ๋ณด๊ณ ํ•ด๋„๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํ™” ๋œ ์ˆ˜์ •์€ ๋˜ํ•œ ํ˜„์žฌ ์ƒํ™ฉ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ๋žŒ๋“ค์ด tsconfig๋ฅผ ํ†ตํ•ด ์˜ตํŠธ ์ธํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ # 1 ๋งŒ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๊ตฌํ˜„ ๋น„์šฉ์ด ์ƒ๋‹นํžˆ ์ €๋ ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์˜ค๊ฒฝ๋ณด๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ• ๋ฟ ๊ธฐ์กด์˜ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. node_modules remapping ํ•ดํ‚น์€ ์ž ์žฌ์ ์œผ๋กœ ์ž˜๋ชป๋œ ๋ฐฉ์‹์œผ๋กœ NPM ๋ชจ๋“ˆ ํ•ด์ƒ๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ˜๋ฉด (์˜ˆ : ๋‚ด๊ฐ€ ์ค€ ๊ฐ€์ƒ์˜ ์˜ˆ ์—์„œ ์ฝ”๋“œ๊ฐ€ ์˜ค์ž‘๋™

์†”์งํžˆ ๋งํ•ด์„œ Typescript์—์„œ ์ด๊ฒƒ์ด "์ˆ˜์ •"๋˜์–ด์•ผํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ JavaScript์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณต๋œ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ instanceof ์—ฐ์‚ฐ์ž๋Š” false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋จผ์ € require ()์— ์—ฐ๊ฒฐํ•  ์ˆ˜์žˆ๋Š” npm ๋งํฌ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ๋Œ€์•ˆ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ข‹์€ ํ†ต์ฐฐ๋ ฅ์ž…๋‹ˆ๋‹ค. pnpm ์„

๊ต์ฒดํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜์žˆ๋Š” npm link ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™์ผํ•œ @types/xxx ํŒจํ‚ค์ง€์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋™์‹œ์— ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ข…์† ๋œ TypeScript ์„ ์–ธ์„ ์ œ๊ณตํ•˜๋Š” ์ข…์†์„ฑ์—์„œ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋‚˜์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ณด๊ณ ํ–ˆ๋“ฏ์ด ํ‘œ์ค€ ์„ ์–ธ์—. ์ด๋Ÿฌํ•œ ํŒจํ‚ค์ง€์˜ ์ˆ˜๋Š” Node ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ TypeScript๋ฅผ ๋” ๋งŽ์ด ์ฑ„ํƒํ•จ์— ๋”ฐ๋ผ ์ฆ๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Yogu ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ •์ฒด์„ฑ๊ณผ ํ‰๋“ฑ์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์œ„์น˜์—์„œ ๋™์ผํ•œ ํŒจํ‚ค์ง€ / ๋ฒ„์ „์„ ๊ฐ€์ ธ ์˜ค๋ฉด ์œ ํ˜•์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์œ ํ˜•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ (์œ ํšจํ•œ) ์ฝ”๋“œ๊ฐ€ ๋–  ์˜ค๋ฆ…๋‹ˆ๋‹ค.

type a = { c: string };
type b = { c: string };

function foo (bar: a) {}

const baz: b = { c: 'd' };
foo(baz);

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ธ ์˜ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (๋ฐ ํ•ด๋‹น @types ํŒจํ‚ค์ง€)์—์„œ ๊ฐ€์ ธ์˜จ ์œ ํ˜•์€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์œ ํ˜• ์ •์˜๋„ ์—…๋ฐ์ดํŠธ๋˜์–ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค).

์ด๋ฆ„๊ณผ ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘๋ณต ํŒจํ‚ค์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๊ฒŒ์‹œ ๋  ๋•Œ typescript@next ์„ (๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

๋งŒ์„ธ,์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :-)

@pgonzal pnpm ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ํฅ๋ฏธ๋กœ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค!

@sompylasar @types/node ์€ ์•ฝ๊ฐ„์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ด์ง€๋งŒ @types/react ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์˜ API ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์„ peerDependencies ๋„ฃ์Šต๋‹ˆ๋‹ค. dependencies ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ข…์†์„ฑ ๋ฒ„์ „์ด ๋ถ€๋ชจ ๋ฐ ์ž์‹ ๋ชจ๋“ˆ๊ฐ„์— ์ผ์น˜ (๋˜๋Š” ์ ์–ด๋„ ํ˜ธํ™˜ ๊ฐ€๋Šฅ)ํ•ด์•ผ ํ•จ์„ ๋ถ„๋ช…ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋ชจ๋‘ ๋ฐ˜์‘์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฐ˜์‘ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๊ตํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ด ๋ฌธ์ œ๋Š” ์ฒ˜์Œ์— ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@harangue ํด๋ž˜์Šค๊ฐ€ ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๋‘ ๋ฒˆ ์„ ์–ธ ๋œ ๊ฒฝ์šฐ์—๋„ JavaScript์—์„œ ๋™์ผํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผ๋˜์ง€ ์•Š๋Š” ๋‘ ๊ฐœ์˜ ๋ณ„๊ฐœ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด instanceof ์—ฐ์‚ฐ์ž๋Š” ์—ฌ์ „ํžˆ ๋‘ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ๋ชจ๋Š” ์ด ๋ฐ”์ด์˜ฌ๋ฆฐ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ TypeScript๋ณด๋‹ค NPM ์ˆ˜์ค€์—์„œ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฒ˜์Œ์— ์—ฌ๋Ÿฌ ์„ ์–ธ์ด ์—†์Šต๋‹ˆ๋‹ค).

@Yogu : +1 : ๋”ฐ๋ผ์„œ @types/node ๊ฐ€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ, ์ฆ‰ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ ๋ฒ„์ „์„ ๋™์‹œ์— ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฒ„์ „์ด๋˜๊ณ  ์ตœ์ƒ์œ„ ํŒจํ‚ค์ง€, ์•„๋งˆ๋„ TypeScript๋Š”์ด๋ฅผ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋กœ ์ทจ๊ธ‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ์ข…์†์„ฑ์— ๋Œ€ํ•ด ํ•ญ์ƒ ์ตœ์ƒ์œ„ @types/node ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

@ andy-ms ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ค์Œ์— ๊ฒŒ์‹œ ๋  ๋•Œ typescript @ next๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

์•„์ง ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€ ์šด์ด ์—†์Šต๋‹ˆ๋‹ค. next ์ด (๊ฐ€) ์ œ๊ณต๋˜๋Š” ์ฆ‰์‹œ์ด ์Šค๋ ˆ๋“œ์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @ andy-ms

์ผ์ผ ๋นŒ๋“œ๊ฐ€ ๋‹ค์‹œ ์ค‘๋‹จ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์€ 2.5.0-dev.20170808 ์ž…๋‹ˆ๋‹ค.

cc / @DanielRosenwasser

์ด๊ฒƒ์ด ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ 2.5.1์„ ์‹œ๋„ํ•˜๋ฉด d.ts๋ฅผ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ํ™•์žฅํ•˜๋”๋ผ๋„ ๋ชจ๋“ˆ์˜ ํ•œ ์ธก๋ฉด ๋งŒ ๋ณด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@types ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ @types/mongodb ๋ผ๊ณ  ๋งํ•˜๊ณ  ํ•ด๋‹น ๋ชจ๋“ˆ์„ ํ™•์žฅํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์„ ์–ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ฉ”์„œ๋“œ์— ์•ฝ์†์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์ด์ œ @types/mongodb ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ mongodb ๋ฐ mongodb ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๋Š” mongo-promisification.d.ts ์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— d.ts ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ„์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ import {somethingFromTypes} from "mongodb" ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ์œ ํ˜• ๋ชจ๋“ˆ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜๊ณ  ์œ ํšจํ•˜๋”๋ผ๋„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋ถˆํ‰ํ•˜์ง€๋งŒ import {somethingFromMyExtendingDts} from "mongodb" ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์•„.

์ปดํŒŒ์ผ ํ•  ๋•Œ ๋ชจ๋“ˆ์ด ํ•ด๋‹น ํ•ญ๋ชฉ์„ ๋‚ด ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง์„ ๋“ฃ๊ฒŒ๋˜๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ ์›ํ•˜๋Š” ๋™์ž‘์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ง€์ • d.ts๋ฅผ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๊ฑฐ๋‚˜ ์œ ํ˜•๊ณผ ํ™•์žฅ์ž d.ts๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ€์ง€๊ณ ์žˆ๋‹ค?

์ตœ์‹  ํ…Œ์ŠคํŠธ ๋นŒ๋“œ (Windows 10 64 ๋น„ํŠธ)๋ฅผ ์‹คํ–‰ ์ค‘์ด๋ฉฐ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒ์‹

๊ตฌ์กฐ

a/
  index.ts
  package.json
b/
  index.ts
  package.json

์šด์˜

cd a
npm link
cd ../b
npm link a

a / index.ts

import { Observable } from 'rxjs/Observable';

export class Foo {
  public bar: Observable<any>;
}

b / index.ts

import { Foo } from '@rxjs-test/a';
import { Observable } from 'rxjs/Observable';

const baz = new Foo();

function qux (quux: Observable<any>) {}

// TypeError
qux(baz.bar);

์šด์˜

b>tsc -v
Version 2.6.0-dev.20170826

b>tsc index.ts
index.ts(11,5): error TS2345: Argument of type 'Observable<any>' is not assignable to parameter of type 'Observable<any>'.
  Property 'source' is protected but type 'Observable<T>' is not a class derived from 'Observable<T>'.

@grofit ๊ท€ํ•˜์˜ ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๋Š” ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์„ ์–ธ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ชจ๋“ˆ๊ณผ ์ฆ๊ฐ•์ž…๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์ด mongo-promisification.d.ts ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

import * as mongodb from "mongodb"; // import the real mongo

// now augment it
declare module "mongodb" {
    // new stuff...
}

import ์—†์œผ๋ฉด ์•ฐ๋น„์–ธํŠธ ์ปจํ…์ŠคํŠธ์— ์žˆ์œผ๋ฉฐ ์ฆ๊ฐ•์ด ์•„๋‹Œ ์ƒˆ ์„ ์–ธ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

( ํ•ธ๋“œ๋ถ ์ฐธ์กฐ)

[email protected] ) ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์ด ํ˜„์žฌ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @ andy-ms์—๊ฒŒ ํฐ ๊ฐ์‚ฌ๋ฅผ๋“œ๋ฆฝ๋‹ˆ๋‹ค-์ด๊ฒƒ์€ ๊ฒŒ์ž„ ์ฒด์ธ์ €์ž…๋‹ˆ๋‹ค!

Observable์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Typescript๋ฅผ ํ†ตํ•ด angular-cli ํ”„๋กœ์ ํŠธ์™€ ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

```function getitems () : Observable
http.get (). map (response : Response) => {
๋ฐ˜ํ™˜response.json ();
}

and when I removed the Observable<T> from function getitems() to not return anything the error disappear.
```function getitems()
http.get().map(response : Response) =>{
return <T> response.json();
}

@ Basel78 ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์™„์ „ํ•œ ์˜ˆ์ œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ typescript@next ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. angular-cli๋Š” ์ค‘๋ณต ์ œ๊ฑฐ ๊ธฐ๋Šฅ์ด์—†๋Š” ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[email protected]์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋งŽ์€ ์˜ค๋ฅ˜ TS2300 : ์ค‘๋ณต ์‹๋ณ„์ž๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋ถˆํ–‰ํžˆ๋„ ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
npm-link-ed ํŒจํ‚ค์ง€์˜ tsconfig :

    "compilerOptions": {
        "module": "amd",
        "target": "es3",
        "sourceMap": true,
        "noEmitHelpers": true,
        "experimentalDecorators": true,
        "baseUrl": ".", // This must be specified if "paths" is.
        "paths": {
            "lib/*": [ "src/lib/*" ],
            "modules/*": [ "src/modules/*" ],
            "vendor/*": [ "src/vendor/*" ]
        },
        "typeRoots" : ["src/typings"]
    },
    "include": [
        "src/**/*.ts",
        "src/**/.*.ts", // TS ignores file names starting with dot by default
        "tests/**/*.ts",
        "tests/**/.*.ts"
    ]

๋ฉ”์ธ ํ”„๋กœ์ ํŠธ์˜ tsconfig ( @croc/webclient ๋Š” ๋งํฌ ๋œ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค) :

    "extends": "./node_modules/@croc/webclient/tsconfig",
    "include": [
        "src/**/*.ts",
        "src/**/.*.ts",
        "node_modules/@croc/webclient/src/**/*.ts",
        "node_modules/@croc/webclient/src/**/.*.ts"
    ],
    "compilerOptions": {
      "baseUrl": ".",
      "typeRoots" : ["node_modules/@croc/webclient/src/typings"],
      "paths": {
        // map runtime paths to compile-time paths
        "lib/*": [ "node_modules/@croc/webclient/src/lib/*" ],
        "modules/*": [ "node_modules/@croc/webclient/src/modules/*" ],
        "vendor/*": [ "node_modules/@croc/webclient/src/vendor/*" ]
      }
    }

@ evil-shrike ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mhegazy ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค
https://github.com/evil-shrike/typescript-npmlink-issue
propject ๋ฃจํŠธ์—์„œ :

cd lib
npm link
cd ../main
npm link tstest-lib

๊ทธ๋Ÿฐ ๋‹ค์Œ main :

npm run tsc

์•ˆ๋…•ํ•˜์„ธ์š” @ evil-shrike, ๋ฌธ์ œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ขํ˜”์Šต๋‹ˆ๋‹ค.
lib / tsconfig.json

{
    "compilerOptions": {
        "typeRoots" : ["src/typings"]
    }
}

main / tsconfig.json

{
    "extends": "./node_modules/tstest-lib/tsconfig",
    "include": [
        "node_modules/tstest-lib/src/**/*.ts"
    ]
}

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ( tsc --listFiles ๋ถ€ํ„ฐ) ๋‘˜ ๋‹ค ํฌํ•จํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค :

/main/node_modules/tstest-lib/src/typings/jquery/index.d.ts
/lib/src/typings/jquery/index.d.ts

(๊ฐ€)๋ถ€ํ„ฐ node_modules ์—์„œ ์˜จ๋‹ค include ๋ฐ ๋ชจ๋“ˆ ํ•ด์ƒ๋„์—์„œ, ์šฐ๋ฆฌ๊ฐ€ ์ „ํ™”๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค realpath ๊ฐ€ ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํฌํ•จ ๋œ ํŒŒ์ผ๋กœ ๋๋‚˜๋Š”, ๊ทธ๋ž˜์„œ ๊ฑฐ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  node_modules ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋ณ„๋„๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‹ค๋ฅธ ์™ธ๋ถ€ ํŒจํ‚ค์ง€์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

@ andy-ms
์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•„์ž์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ ๋œ lib์—๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์—ญ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๋งŽ์€ ์ฃผ๋ณ€ d.ts๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JQueryStatic์ฒ˜๋Ÿผ :

interface JQueryStatic {
    cleanData (elems);
}

๋˜๋Š”๋กœ๋“œ ๋œ (requirejs)์— ๋Œ€ํ•œ ์ ‘๋‘์‚ฌ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

declare module "i18n!*" {
    //const m: { [key: string]: string };
    const m;
    export = m;
}

๊ทธ๋Ÿฐ ๋‹ค์Œ lib์˜ ์†Œ์Šค ์–ด๋”˜๊ฐ€์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const oldCleanData = $.cleanData;
$.cleanData = function (elems: JQuery) {
..
    oldCleanData(elems);
};

์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ (lib์—์„œ)์„ main์˜ ์–ด๋”˜๊ฐ€์— ๊ฐ€์ ธ ์˜ค๋ฉด ์ปดํŒŒ์ผ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

lib์˜ ์†Œ์Šค์—์„œ /// <reference types="" /> (๋˜๋Š” /// <reference path="" /> ) ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋งˆ๋‹ค ํ•„์š”ํ•œ ์ž…๋ ฅ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด "ํฌํ•จ"์—์žˆ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ ์˜ค๋ฉด ์ฐธ์กฐ ๋œ ์œ ํ˜•์ด ํ”„๋กœ์ ํŠธ์— ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

@ andy-ms ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. lib๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ–ˆ์œผ๋ฉฐ ์ด์ œ npm-link-ed๊ฐ€ ์ž˜ ์ปดํŒŒ์ผ๋˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋„ˆ๋ฌด ํฐ ๋ณต์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ Observable<T> !== Observable<T> ์™€ ๊ด€๋ จํ•˜์—ฌ angular @ next ๋ฐ typescript @ next ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CLI์˜ ๋ฒ ์–ด ๋ณธ ์„ค์น˜์—์„œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/intellix/angular-cli-red
https://github.com/intellix/angular-cli-blue

Blue๋Š” Red์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์„œ๋น„์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@intellix tsc ๋ช…๋ น ์ค„ ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ng ์–ด๋–ค ๋ฒ„์ „์˜ ํƒ€์ดํ”„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@ andy-ms ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ตฌ์ถ•์ค‘์ธ vscode ํ™•์žฅ๊ฐ„์— npm ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ชจ๋‘ vscode ๋ฅผ ๊ฐ€์ ธ์™€ ์ค‘๋ณต ์‹๋ณ„์ž ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.
TS Version 2.7.0-dev.20171118

๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด "rxjs / *"๋ฅผ tsconfig ํŒŒ์ผ์˜ ๊ฒฝ๋กœ ์„น์…˜์—์žˆ๋Š” node_modules ๋‚ด์˜ ํŠน์ • rxjs ํด๋”์— ๋งคํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด npm ๋งํฌ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ๋งํฌ์—์„œ ํŒจํ‚ค์ง€๋กœ์˜ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์—์„œ ๋น„ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋กœ ์ด๋™ํ•  ๋•Œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ด SO ์งˆ๋ฌธ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค : https://stackoverflow.com/questions/38168581/observablet-is-not-a-class-derived-from-observablet

@dakaraphi @JoshuaKGoldberg ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ์ง€์นจ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

package.json ๋™์ผํ•œ "๋ฒ„์ „"๊ฐ’์ด์žˆ๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ์ด๋ฏธ ๋ณธ ๊ฒฝ์šฐ ์ƒˆ ๋™์ž‘์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „์ด ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์„ค์น˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ์‚ฌ๋ณธ์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋‘ ์„ค์น˜ ์ค‘ ํ•˜๋‚˜์— ๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค๋ฉด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ andy-ms ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

  1. https://github.com/dakaraphi/vscode-extension-fold
  2. https://github.com/dakaraphi/vscode-extension-common

vscode-extension-common ์—์„œ vscode-extension-fold vscode-extension-common ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ npm ์„ค์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ €์žฅ์†Œ๋ฅผ ์ฒดํฌ ์•„์›ƒํ•˜๋ฉด package.json ์˜ vscode-extension-fold package.json ์— ๊ฒฝ๋กœ ๋งคํ•‘ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ํ•ด๋‹น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dakaraphi ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์˜ค๋ฅ˜๋Š” vscode.d.ts ์ด ์™ธ๋ถ€ ๋ชจ๋“ˆ์ด ์•„๋‹Œ ์ „์—ญ, ์ฃผ๋ณ€ ์„ ์–ธ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Microsoft / vscode-extension-vscode # 90์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ rxjs ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด์žˆ๋Š” 2 ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. [email protected] ๋ฐ [email protected] ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํŒจํ‚ค์ง€ ๋ชจ๋‘ ๋˜‘๊ฐ™์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@SamVerschueren ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ์ง€์นจ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ typescript@next ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค.

@ andy-ms ๋‚ด๊ฐ€ ๋ญ˜ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณผ๊ฒŒ์š”!

@ andy-ms ์—ฌ๊ธฐ ์ž‘์€ ๋ณต์ œ ์ €์žฅ์†Œ https://github.com/SamVerschueren/ts-link-6496์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด [email protected] ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. mod-a ๋ฐ mod-b ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๋ชจ๋‘ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. mod-b ๋ฅผ yarn build ์ปดํŒŒ์ผ
  3. ์ปดํŒŒ์ผ mod-a ์™€ yarn build

3 ๋‹จ๊ณ„๋Š” ๋‹ค์Œ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

src/index.ts(7,15): error TS2345: Argument of type 'UnaryFunction<Observable<string>, Observable<string>>' is not assignable to parameter of type 'UnaryFunction<Observable<string>, Observable<string>>'.
  Types of parameters 'source' and 'source' are incompatible.
    Type 'Observable<string>' is not assignable to type 'Observable<string>'. Two different types with this name exist, but they are unrelated.
      Property 'buffer' is missing in type 'Observable<string>'.
src/index.ts(7,47): error TS7006: Parameter 'result' implicitly has an 'any' type.

[email protected]์—์„œ ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ typescript @ next๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ๋ฟŒ๋ฆฌ๋Š” ๋งํฌ ๋œ ํŒจํ‚ค์ง€๋Š” ์—ฌ์ „ํžˆ ์ž์‹ ์˜ ์ง€์—ญ์—์žˆ๋Š” ์œ ํ˜• ์ •์˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค node_modules ์œผ๋กœ๋ถ€ํ„ฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉํ•˜์—ฌ typings node_modules ๊ฐ€๋Šฅํ•˜๋ฉด ๊ทธ๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š”๋กœ. ๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค๊ณผ ๊ฒฐํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ์ „์—ญ์€ ๋‹ค์‹œ ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ์ด๋กœ ์ธํ•ด ์ƒ์œ„ ํ”„๋กœ์ ํŠธ์˜ node_modules ๋ฐ ์—ฐ๊ฒฐ๋œ ํŒจํ‚ค์ง€์˜ node_modules ๋ชจ๋‘์—์„œ ์ „์—ญ์ด ์ •์˜ ๋  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋™์ผํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค๋Š” ์„œ๋กœ ํ• ๋‹น ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ์ด๋กœ ์ธํ•ด ๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ์˜ node_modules ์—์„œ ์œ ํ˜•์ด ํด๋ž˜์Šค ์ธ ๋ณ€์ˆ˜๋ฅผ ์œ ํ˜•์ด ์ž์ฒด node_modules ์ •์˜ ๋œ ์—ฐ๊ฒฐ๋œ ํŒจํ‚ค์ง€๊ฐ€ ๋ฐ˜ํ™˜ ํ•œ ๊ฐ’์— ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰์„ํ•ฉ๋‹ˆ๋‹ค.

paths ๊ตฌ์„ฑ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ •์˜๊ฐ€ @types/* ์—์„œ ๋‚˜์˜จ ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ ์—ฌ๊ธฐ ์— ์ œ์•ˆ ๋œ๋Œ€๋กœ ๊ฐ„๋‹จํžˆ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"paths": {
  "*": ["node_modules/@types/*", "*"]
}

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

"paths": {
  "rxjs": ["node_modules/rxjs"],
  "rxjs/*": ["node_modules/rxjs/*"]
}

๋˜ํ•œ TS 2.8.3์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ ํ•  ๋•Œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

},
"devDependencies": {
    "@types/MyLib": "file:../MyLib/bin/npm/@types"
},

v3๋ถ€ํ„ฐ npm์€ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ์„ ์‹œ๋„ ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฐ๊ฒฐ๋œ ์ •์˜ ํŒŒ์ผ์„ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„์ ์ด๊ณ  ์ถฉ๋Œํ•˜๋Š” ํŒŒ์ผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

node_modules\@types\MyLib\index.d.ts(3,11): error TS2300: Duplicate identifier 'Foo'.
C:/MySolution/MyLib/bin/npm/@types/index.d.ts(3,11): error TS2300: Duplicate identifier 'Foo'.

๋Œ€์‹  ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. typeRoots: ["./node_modules/**/"] ์„ค์ •ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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