TypeScript ์ฌ์ฉ 1.7.3.
์๋ npm ํจํค์ง๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ ์ธ ํ์ผ์ TypeScript ์ปดํ์ผ๋ฌ์ ์ํด ์์ฑ๋๋ฉฐ ์ฌ๊ธฐ์ ์ค๋ช
๋ ๋ฐฉ์์ผ๋ก ๋ค๋ฅธ ํจํค์ง์์ ์ฐธ์กฐ๋ฉ๋๋ค.
ts src :
export default class ClassA {
private foo: string;
bar: number;
}
ts ์ ์ธ :
declare class ClassA {
private foo;
bar: number;
}
export default ClassA;
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;
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๋ ๋ณ์ ํ ๋น์ ์ปดํ์ผ ํ ๋ ๊ฐ์ธ ์์ฑ์ ๋ฌด์ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋๋ฉด ์ด๊ฒ์ ๋ํ ๋ ๋์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ฌ๊ธฐ์๋ 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
๋ฅผ ์ํํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค.
์ด ์ค๋ ๋๋ฅผ ๋ฐ๋ฅด๋ ์ฌ๋์๊ฒ ... ์ฌ๊ธฐ์ ์ค๋ช ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ํ์ง๋ง (์ง๊ธ๊น์ง) ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ค๋ฅ๋ฅผ ์ฌํํ์ต๋๋ค.
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
๋ง ๋ฐ์ผ๋ฉด :
๊ทธ๋ฌ๋ ๋ ๋ค 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๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ ๋ ๊ฒฝ๋ก์ ์ค์ ๊ฒฝ๋ก๋ฅผ ๊ตฌ๋ถํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ ์ธ์ ๋ ๊ฐ์ ๊ฐ๋ณ ์ ์ธ์ผ๋ก ์ธ์ํฉ๋๋ค. ํด๊ฒฐ์ฑ ์ ๋ค์ ์ค ํ๋์ ๋๋ค.
@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
ํ๋ก์ ํธ ๊ฒฝ๋ก์ ์ค๋ฅ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
๋๋ 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๋ฅผ๋ณด๊ณ ํ์ง ๋ง์ญ์์ค.
์ด๋ฌํ ๊ธฐ์ค ์ค ํ๋๋ผ๋ ์ถฉ์กฑ๋์ง ์์ผ๋ฉด TS2345๋ฅผ๋ณด๊ณ ํด๋๋ฉ๋๋ค.
ํธ์ ๋ด์ ๊ฐ๊ธฐ
@seansfkelley Webpack ์ค๋ฅ๋ TypeStrong / ts-loader # 468์ ์ํด ์ถ์ ๋ฉ๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ,
๋๊ตฐ๊ฐ ํด๊ฒฐ์ฑ
์ ์ฐพ์์ต๋๊น?
RxJS๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ฐ๊ฒฐํ ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ฌ ;)
์๋
ํ์ธ์, ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ข
์์ฑ์ ์ํด ๋ฐํ ๋ Observable์ Observable#from
๋ก ๋ํํ๋ ๊ฒ์
๋๋ค.
์์ง ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค. ?
์ฌ๊ธฐ์๋ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ts-loader ์ฌ์ฉ์๊ฐ ์ค๋ณต ์ ์์ ๋ํด ์๋ชป๋ ์ค๋ฅ๋ฅผ๋ฐ๋ ๊ฒ์ ์ปดํ์ผ๋ฌ API์ ๋ํ ์๋ชป๋ ์ ๋ ฅ์ผ๋ก ์ธํด ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ํ ์์ ์ TypeStrong / ts-loader # 468์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ๋ ๋์ผํ ํจํค์ง (๋์ผํ npm ํจํค์ง + ๋ฒ์ )๊ฐ ๋ ๊ฐ์ ์ค์ฒฉ ๋ ํด๋์ ๋ก์ปฌ๋ก ๋ ๋ฒ ์ค์น๋ ๊ฒฝ์ฐ ( npm link
์ฌ์ฉํ์ง ์์), Enum ๋๋ ๊ฐ์ธ ๋ฉค๋ฒ๊ฐ์๋ ํด๋์ค๋ฅผ ๋น๊ตํ์ฌ ์ด ๋ ํจํค์ง์ ์ ํ์ ํธํ๋์ง ์๋ ๊ฒ์ผ๋ก ์คํจํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ์ข ๋ ๋ณต์กํ๋ฉฐ ํจํค์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ปดํ์ผ๋ฌ์์ ํจํค์ง๋ฅผ "์ค๋ณต ์ ๊ฑฐ"ํ๋ ค๋ฉด ์ถ๊ฐ ์์
์ด ํ์ํฉ๋๋ค.
์ด ๋ ๋ฒ์ฃผ ์ค ์ด๋ ๊ฒ๋ ํด๋น๋์ง ์๋ ๊ฒฝ์ฐ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ ์ถํ๊ณ ๋ฌธ์ ๋ฅผ ํ์ง์์ ์ฌํ ํ ์์๋ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ ๊ณตํด ์ฃผ์๋ฉด ์์ธํ ์กฐ์ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
@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
์ธ์ง ํ์ธํด์ผํฉ๋๋ค.
์ด ์์ ์ ๋ค์ ์ํฌ ํ๋ก๋ก ์ํํฉ๋๋ค.
node_modules
์ญ์ npm link xlib
๋ด ์๋น ํ๋ก์ ํธ์ node_modules
์์ xlib
์ ๋ํ sym_link๋ฅผ ์์ฑํฉ๋๋ค.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์ ๋ฃ์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ๋ณด๊ณ ์ถ๊ฑฐ๋ ๋์์ฃผ๊ณ ์ถ๋ค๋ฉด ๋ฐ ๊ณต๊ฐ์ ์ผ๋ก ์คํํ๊ณ ์์ต๋๋ค. ๋ค์์ ์์ ์์ด๋์ด๋ฅผ ์๋ ํ ๊ฒ์ ๋๋ค.
๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ฒฝ๋ก๋ฅผ ์ค์ ํ ์๋ ์์ต๋๋ค.
{
"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์์ ๊ทธ๋ค์ ์ถ๋ฐฉํ๋ ๋ฐ ๋ช ๋ฌ์ ๋ณด๋์ต๋๋ค. ๋ด ์๊ฐ๋๋ก ์ฌ์ฉํ๋ฉด ํผ์ด ์ข ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋ช ๊ฐ์ง ์๋ก์ด ๋ฌธ์ ์ ๊ฑฐ๋ํ์ฌ ๋ณ๋ ฌ ๋ฒ์ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ ์ฒด ํธ๋ฆฌ๊ฐ ๋ฐ์ ๋ฉ๋๋ค. ์ฆ, ์ด์ ๋ชจ๋ ํจํค์ง๊ฐ ๊ฐ์ ์ข ์์ฑ์ด์๋ ํจํค์ง์ ๋ํ ํ๋ ์ข ์์ฑ์ ๋ด๋นํ๊ฒ๋ฉ๋๋ค.
ํผ์ด ์ข ์์ฑ์ด ์ ๊ฑฐ๋๋ฉด ์ด๋ฌํ ํ๋ ์ข ์์ฑ์ ์ ๊ฑฐ๋์ง ์์ ๊ฒ์ ๋๋ค.
ํจํค์ง ์์ฑ์๋ ๋๋ฃ ๋ฒ์ ํจํด์ ๋ํด ๊ด๋ฒ์ํ ๋ฒ์๋ฅผ ์ฌ์ฉํ๊ณ ์ค์ ๋ก ํ ์คํธํ์ง ์์ ๋ฒ์ ์ผ๋ก ์์ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๊นจ์ง ๋น๋๊ฐ ๊ฐ์๊ธฐ ์๋น์์ ๋ฌธ์ ๊ฐ๋ฉ๋๋ค.
์ํ๋ค.
๋ด๊ฐ ์ฌ์ฉํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ์ธ ๊ฐ์ง ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
tsc
์ปดํ์ผ๋ฌ๋ VS2017๋ณด๋ค ํจ์ฌ ๋ ๊ด๋ํฉ๋๋ค. ์๋ง๋ VS2017์ด ๋ฉ์ง ์ง๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฝ๋ (์ฌ๋ณผ ๋งํฌ ๋ node_modules
)๋ฅผ ํฌ๋กค๋งํ์ฌ ํผ๋๋๊ธฐ ๋๋ฌธ์ผ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ํฌ๊ณ ๋ณต์กํ ๋ค์ค npm ๋ชจ๋ ํ๋ก์ ํธ๊ฐ ์์ผ๋ฏ๋ก VS2017์ ์ฌ์ฉํ์ญ์์ค ... ๊ทธ๋ฌ๋ฏ๋ก ๋น์ทํ ์๊ตฌ ์ฌํญ์ด ์์ผ๋ฉด ์ต์
2์ 3์ ์ฝ์ผ์ญ์์ค ....
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๋ฅผ๋ณด์ญ์์ค.
.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",
๊ฐ 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๋ก๊ฐ๋ ๊ธธ์ ์ฐพ๊ธฐ๋ฅผ ์ ๋ง๋ก ๋ฐ๋๋๋ค.
ํธ์ง : ๐ฎ
ํฅ๋ฏธ ๋กญ๊ตฐ. 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๋ฅผ๋ณด๊ณ ํ์ง ๋ง์ญ์์ค.
- ๊ณต์ฉ ์๋ช ์ ์ผ๋ฐ์ ์ธ TypeScript ๋ ํ์ดํ์ ๋ฐ๋ผ ํธํ๋ฉ๋๋ค.
- ํด๋์ค๋ ๋์ผํ ์ด๋ฆ๊ณผ ๋ฒ์ ์ผ๋ก NPM ํจํค์ง ํด๋์ ์ ์๋ฉ๋๋ค (package.json์ ๋ฐ๋ฆ).
- ํด๋์ค๋ ๋ชจ๋์ ๋ํด ๋์ผํ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ต๋๋ค (์ : "./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
import { Observable } from 'rxjs/Observable';
export class Foo {
public bar: Observable<any>;
}
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์ ๊ฐ์ ธ์ฌ ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
```function getitems () : Observable
http.get (). map (response : Response) => {
๋ฐํ
}
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 ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์ฅ์์ ๋๋ค.
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]
๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
mod-a
๋ฐ mod-b
๋ํ ์ข
์์ฑ์ ๋ชจ๋ ์ค์นํฉ๋๋ค.mod-b
๋ฅผ yarn build
์ปดํ์ผ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
๊ฐ๋ฅํ๋ฉด ๊ทธ๋ค์ด ์ฐ๊ฒฐ๋์ด์๋๋ก. ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค๊ณผ ๊ฒฐํฉ๋์์ต๋๋ค.
node_modules
๋ฐ ์ฐ๊ฒฐ๋ ํจํค์ง์ node_modules
๋ชจ๋์์ ์ ์ญ์ด ์ ์ ๋ ๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ถํํฉ๋๋ค.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/**/"]
์ค์ ํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ฆ๊ณผ ๋ฒ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ณต ํจํค์ง๋ฅผ ๊ฐ์งํ๊ณ ํ๋๋ง ์ฌ์ฉํ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณํฉํ์ต๋๋ค. ๋ค์์ ๊ฒ์ ๋ ๋
typescript@next
์ (๋ฅผ) ์ฌ์ฉํ์ฌ ์ฌ์ฉํด๋ณด์ญ์์ค.