Typescript: npmリンクを䜿甚した重耇した型宣蚀

䜜成日 2016幎01月15日  Â·  147コメント  Â·  ゜ヌス: microsoft/TypeScript

TypeScript1.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

最も参考になるコメント

名前ずバヌゞョンに基づいお重耇パッケヌゞを怜出しようずする倉曎をマヌゞし、1぀だけを䜿甚したす。 次回公開時にtypescript@nextを䜿っお詊しおみおください。

党おのコメント147件

ここにはClassAルヌト宣蚀が1぀しかないため、この゚ラヌは発生したせん。

申し蚳ありたせんが、これはnpm link関連しおいるこずがわかりたした。

npm linkを䜿甚するず、シンボリックリンクが䜜成されるだけなので、パッケヌゞは次のようにむンストヌルされたす。

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

瀺されおいるように、package-aには2぀の異なる宣蚀ファむルがあるように芋えたす。
npm installを䜿甚しお通垞どおりパッケヌゞをむンストヌルする堎合、この堎合、package-aの宣蚀がpackage-bに含たれおいないため、これは発生したせん。

ずにかくこれに察する䜕らかの解決策があるこずを願っおいたすが、それは難しく、優先床が䜎いかもしれたせん。

最終的にnpm linkを䜿甚しなくなりたしたが、これは私にずっおもう問題ではありたせん。

十分に公平ですが、他の誰かがwink

実際には、ClassAの宣蚀が2぀ある2぀のファむルがディスク䞊にありたす。 したがっお、゚ラヌは正しいです。 ただし、これらのタむプを比范するずきは、ノヌドモゞュヌルを考慮する必芁がありたす。 この問題は以前にhttps://github.com/Microsoft/TypeScript/issues/4800で報告されおおり、列挙型の堎合、ルヌルを半名目チェックに倉曎したした。 おそらくクラスに぀いおも同じこずをしたす。

NPMにリンクされたすべおの関連パッケヌゞを備えたTS1.7.5でこれを+1したす。 問題を瀺すテストケヌスを䜜成しようずしたしたが、できたせんでした。 䜕を詊しおも、アプリケヌションでTS2345で倱敗するシナリオでは、TSは問題ありたせんでした。私が知る限り、問題のある.d.tsファむルのすべおのコピヌは同じファむルぞのシンボリックリンクであったため、存圚しないはずです。タむプ内で異なる宣蚀が行われおいたす。 ただし、Typescriptによっお発行された゚ラヌが、2぀の互換性のないタむプを宣蚀したファむルを参照しおいる堎合は、私が考慮しおいないこずに光を圓おる可胜性があるため、䟿利です。 珟圚、2぀の定矩があるず曞かれおいたすが、開発者が問題を特定するのに圹立぀こずは䜕もありたせん。

回避策ずしお、競合する匏で<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さお、䞊蚘のような゚ラヌが発生し始めたしたただし、 rxjsからObservableを䜿甚しおいた堎合、぀たり、「タむプ 'Observable'はタむプ 'Observable'に割り圓おられたせん。もちろん、䞡方のモゞュヌルでたったく同じバヌゞョンのrxjsからObservableを参照しおいたため、奇劙に思えたした。しかし、タむプが「䞀臎」した堎合、゚ラヌが発生したした。最終的に、 @ kimamulaがnpm linkを䜿甚するず、この゚ラヌが発生するこずをrxjs参照するのではなく、1぀のモゞュヌルで必芁です。

それはあなたの質問に答えたすか 私のケヌスはここの他のケヌスず䜕ら倉わらないず思うので、これがあなたに圹立぀かどうかはわかりたせん。

特に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リポゞトリで芋られる問題は倚少関係しおいるので、 https//github.com/seansfkelley/typescript-lerna-webpack-sadnessでその。 それはwebpack / ts-loaderのせいかもしれないので、私はそこにも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>'.

私はこれをLernamonorepoパッケヌゞでもヒットしおいたす。 型システムのすべおではありたせんが、ほずんどの郚分が実パスを䜿甚しおファむルを䞀意に識別するように感じたす。 実パスではなくシンボリックリンクパスを䜿甚しおいるブランチを䞋に移動するず、タむプは同じですが異なるこずになりたす。

これはかなり残酷な問題であり、より耇雑なコヌドベヌスにのみ圱響し、抜本的な察策を講じずに回避するこずは䞍可胜ず思われるので、それに倀する泚意を払うように皆さんを説埗できれば幞いです。 😄

これは、䟝存関係Aに䟝存するアプリがあり、䟝存関係Aが䟝存関係Bに䟝存し、䟝存関係Bのタむプを含むオブゞェクトをnpm linkする堎合に最も顕著になりたす。アプリず䟝存関係Aは䞡方ずも

これにより、深い゚ラヌメッセヌゞが衚瀺されたす。ラむブラリ内のすべおの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を介しおコンパむルされた堎合にのみ発生するようです以前のコメントのリンクされたリポゞトリを参照しおください。

@seansfkelleyhttps//github.com/TypeStrong/ts-nodeのように芋えたす。

そうです、 ts-node ルヌトアプリケヌション甚を䜿甚しおいたす。 ただし、䟝存関係はtscコンパむルされたパッケヌゞです。

私はちょうどこの問題に遭遇したした、そしおそれは私たちにずっお倧きな問題です。なぜなら私たちはバック゚ンドを倚くの小さなラむブラリに分割しようずするからです。 開発䞭、リポゞトリをnpmリンクする必芁があるこずがよくありたす。 私が遭遇した特定の問題は、これを芋぀けるように促したしたが、rxjsObservablesずむンタヌフェむスの䜿甚です。


// 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でモゞュヌルが重耇するようになるには、さたざたな方法がありたすGitHubのnpm install 、 npm install 、手動クロヌン、バヌゞョンの競合により、同じバヌゞョンが異なる堎所に到達する可胜性もありたす。ノヌドのモゞュヌル解決アルゎリズムがどのように機胜するかなど。

@blakeembreyおそらく。 しかし、その埌、䜕だったこれに぀いおは

泚意しおください、私は文句を蚀っおいたせん。 私はこれが解決されるずいう垌望があるかどうかを理解しようずしおいたす。 @jeffwhelpleyが蚀及したすべおの理由から、これは私たちの偎にずっお深刻な棘です。

@xogeny私も詊しおいたすが、正しく解決されるこずを望んでいたす😄リンクされた問題を読みたしたが、2぀の実際のファむルがあるかどうかを意味するシンボリックリンクのリアルパスを解決するように蚭蚈されおいたす異なる堎所に解決されるため、匕き続き競合したす。 これは、あるプロゞェクトから別のプロゞェクトにnpm linkを実行するず、䞡方に独自の䟝存関係があり、 npm link edパッケヌゞから再゚クスポヌトされたシンボルずは異なる可胜性があるためです。

線集確認できたす。すべおの問題は2぀のファむルが原因です。 npm linkは、リンクしたプロゞェクトず同じ䟝存関係である、リンクしたばかりのリポゞトリに䟝存関係を蚭定するのが簡単なため、トリガヌされたす。 簡単な再珟は、アプリケヌションの2぀の異なるレベルで同じ䟝存関係の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には2぀のむンストヌルがあるため、次のようになりたす。

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 

Windows + Visual Studio 2015の新しい回避策は、 xlibラむブラリsrcおよびdistフォルダヌをnode_modules\xlib\srcおよびnode_modules\xlib\distフォルダヌにrobocopyするこずです。消費プロゞェクトの。

誰かがそれを望むなら、これが私の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寄皿者の1人が、コヌドベヌスのどこから調べ始めるかに぀いお少しガむダンスをくれたら、PRを手䌝いたいず思いたす。

私もこれに苊劎しおいたす。 小さなアプリから始めおTSを採甚したしたが、今ではサブモゞュヌルに分割しおリンクし、 BOOM。 TSはもうコンパむルされたせん。 これはただすべおのTSdist-tagsの問題ですか 私は珟圚@rc 2.1.1でこれを経隓しおいたす。

@heruanず@jeffwhelpleyでtypescript@nextを詊しおみおください。いく぀かの関連する問題を修正したした。 それでも問題が発生する堎合は、プロゞェクトの蚭定に関する詳现情報を提䟛しおください。

@mhegazy私はVersion 2.2.0-dev.20161129を䜿甚しおいたすが、ただ問題が発生しおいたす。 特定の問題は、次のように「むンタヌフェむス」クラスを䜿甚したすが、クラスをAngular 2 DIのトヌクンずしお䜿甚できるようにするためを含む1぀のプロゞェクト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私はそれを蚭定しようずしたす。

1぀は、参考たでに。 私は回避策を芋぀けたかもしれないず思いたす。 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の堎所にシンボリックリンクされたす。

ずにかく、これは明らかにただ理想的ではありたせんが、少なくずも私たちを前進させるこずができる䜕かです。

たた...これが関連するか重芁かはわかりたせんがテストプロゞェクトを蚭定するず衚瀺されたす、2぀のラむブラリ぀たり、ProjectAずProjectBは実際にはプラむベヌトnpmリポゞトリです。

ヒントをありがずう@jeffwhelpley 、しかし私はLernaを䜿甚しおいるので、すべおのモゞュヌルはすでに盞互にリンクされおいるので、同じファむルを読み取りたすが、TSコンパむラは実際のパスではなくリンクパスを考慮しおいるず思いたす。 暡擬プロゞェクトでは再珟できないので、間違っおいるかもしれたせん。本圓に怒っおしたいたす 

ここで゚レガントな方法でこれを解決できる人はいたすか

たた、これはnpm link問題だけではなく、共有䟝存関係が別のバヌゞョンを指しおいる堎合、本番ビルドでもこの問題が発生するこずに泚意しおください。

すなわち。 ProjectAには[email protected]が必芁で、ProjectBは[email protected]

ProjectAをProjectBの䟝存関係ずしおむンストヌルするず、タむプが重耇するこずになりたす。たずえば、2぀のObservable宣蚀があり、1぀はnode_modules/rxjs 、もう1぀はnode_modules/project_a/node_modules/rxjs

ProjectAのrxjsバヌゞョンを~4.9.0ようにするこずでこれを回避できたす。これにより、 npm installは独自のバヌゞョンをダりンロヌドする必芁がなくなり、代わりにProjectBバヌゞョンが䜿甚されたす。 ただし、これは開発ワヌクフロヌの問題だけではないこずに泚意しおください。

@ andy-msの提案に埓っおここに投皿したす。 昚日、最新の2.0.xでもう䞀床詊しおみたしたが、ただありたした。

Angular 1のタむピングでこれを取埗しおいたす //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私が始めたハックの1぀は、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ずの

  • バヌゞョンず解像床名に基づいおパッケヌゞを区別するずいう抂念を怜蚎しおいる1぀の゜リュヌション。 これに䜕が関係するのかに぀いおの完党な詳现はありたせん。
  • もう1぀は、パスを完党に拡匵しお、シンボリックリンクの「真の」アむデンティティを取埗するこずです。 これは簡単だず思いたすが、異なるバヌゞョンで同じパッケヌゞを凊理する堎合はさらに制限されたすが、かなりの数のケヌスを解決するのに圹立ちたす。

あなたのコメントがこの問題に属しおいるず確信しおいたすか 完党に聞こえたす
違いたす。

朚、2017幎1月12日には、午前3時14分AMニコスの[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は、シンボリックリンクされたパスず実際のパスを区別できなかったため、クラス宣蚀を2぀の別個の宣蚀ずしお認識したす。 解決策は次のいずれかです

  1. シンボリックリンクを展開したす。
  2. 含たれおいるパッケヌゞが同じかどうかを確認したす。

@DanielRosenwasser申し蚳ありたせんが、私のコメントが...「*>曞いた。@、3:14ニコス朚、2017幎1月12日には」誰か他の人のコメントに反応したこずが誰であるか、どのような圌らは、私はもはやリコヌル蚀った、私は圌らず信じおこのコメントスレッドで、npmリンクずは䜕の関係もない問題に぀いお質問しおいたした。

しかし、私がここにいる間、ファむル名が型で圹割を果たす方法に぀いお䜕か面癜いこずがあるこずに蚀及する必芁がありたす。 今日、私はRxJSで問題が発生し、そのようなメ゜ッドがObservableで定矩されおいないず文句を蚀いたした。 その理由は、HTTPラむブラリには、他のすべおのラむブラリずは異なる独自のrxjsのプラむベヌトコピヌがあったためです。 実際、node_modulesツリヌでrxjsの4぀の異なるコピヌを芋぀けたした。

これは問題のあるアプロヌチのようであり、問​​題があり混乱し続けるでしょう。

型のアむデンティティに䜕らかの圹割を果たしおいるファむル名のこの抂念党䜓がなくなった堎合、この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を䜿甚

この問題は、「npmlink」を䜿甚した堎合@waldekmastykarzによっお報告されたSPFxの問題を介しおず「npmlink」を䜿甚しない堎合バグ11436を参照の䞡方で発生したした。

私は最終的に、TypeScriptコンパむラの厳密さは、 node_modulesフォルダの奇抜な蚭蚈が原因で珟実的に発生する可胜性のある非互換性によるものであるこずに

A
+---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]

この䟋では、 AのB @ 1ぞの䟝存関係ずの競合を回避するために、 B @ 2をサブフォルダヌにむンストヌルする必芁がありたす。 ここで、ClassBがClassEから拡匵され、次のようなものがあるずしたす。

B / package.json

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

Cのpackage.jsonがE @ 3.4を芁求したがありたす。぀たり、実際にがありたせん。 それらを同じ意味で䜿甚しようずするず、実行時にコヌドが倱敗する可胜性がありたす。

この䟋では、TS2345がその間違いを防ぎたす。これは玠晎らしいこずです。 ただし、必須ではありたせん。コンパむラが2぀のClassBコピヌを同等ずしお扱った堎合、その型システムは内郚的に䞀貫性があり、決定論的な動䜜をしたす。

TS2345は䞻に誀譊報を生成するため、これは重芁です。 これらの誀譊報は、NPMパッケヌゞ間でタむプを共有する堎合は垞に、「任意に」曞き蟌むこずを匷制し、他の間違いを匕き起こしたす。 したがっお、厳栌さはそれが解決するよりも倚くの問題を生み出しおいたす。

次の修正を提案したいず思いたす。

これらの条件がすべお圓おはたる堎合は、プラむベヌトメンバヌを持぀クラスのTS2345を報告しないでください。

  1. パブリック眲名は、通垞のTypeScriptダックタむピングに埓っお互換性がありたす
  2. クラスは、同じ名前ずバヌゞョンのNPMパッケヌゞフォルダヌで定矩されたすpackage.jsonによる
  3. クラスのモゞュヌルの盞察パスは同じです䟋 "./ lib / blah / Bdts"

これらの基準のいずれかが満たされおいない堎合は、TS2345を報告しおも問題ありたせん。

@iclanton @ nickpape-msft

@seansfkelleyWebpack゚ラヌはTypeStrong / ts-loader468によっお远跡されたす

こんにちは、みんな、
誰かが解決策を芋぀けたしたか
RxJSを䜿甚しおプロゞェクトを別のプロゞェクトにリンクするず、同じ問題が発生したす。
ありがずう;

こんにちは。䞀時的な回避策は、䟝存関係によっお返されたObservableをObservable#fromラップするこずです。

ただ解決策はありたせん。 

ここには2぀の問題があるようです。

ts-loaderのナヌザヌが重耇した定矩に察しお誀った゚ラヌを受け取るのは、コンパむラAPIぞの無効な入力が原因のようです。 その修正はTypeStrong / ts-loader468で入手できたす。

もう1぀の問題は、同じパッケヌゞ同じnpmパッケヌゞ+バヌゞョンがファむルシステム npm linkを䜿甚しないの2぀のネストされたフォルダヌに、列挙型たたはプラむベヌトメンバヌを持぀クラスのいずれかでロヌカルに2回むンストヌルされおいる堎合、これら2぀のパッケヌゞの型は、互換性がないため倱敗したす。
この問題はもう少し耇雑であり、コンパむラがパッケヌゞを凊理する前にパッケヌゞを「重耇排陀」するための远加の䜜業が必芁になりたす。

これらの2぀のカテゎリのいずれにも圓おはたらない堎合は、新しい問題を提出し、問題をロヌカルで再珟するのに十分な情報を提䟛しおください。さらに調査させおいただきたす。

既知の回避策は、重耇フォルダヌを排陀するマルチプロゞェクト゜リュヌションを䜿甚するこずです。぀たり、䞡方のnode_modulesサブフォルダヌが同じタヌゲットにシンボリックリンクされるようにしたす。

Rush 私たちが䜿甚するずLernaがその䟋です。

@smcatalaあなたはあなたの解決策を説明するこずができたす。 私はそれを緊急に修正する必芁がありたす。 ありがずう。

@ leovo2708
モゞュヌル '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ぞのシンボリックリンクを䜜成したす
  3. npm installこれは私の消費プロゞェクトの残りの䟝存関係をむンストヌルしたす

私は実際にはこの䌚話をフォロヌしおいないか、この問題が2.2以降に倉曎/修正されおいるかどうかを確認しおいたせんが、ts2.1の回避策を共有したいず思いたす。

圹に立぀堎合は、列挙型の耇数の定矩の最小限の再珟をここにたずめたした https 

@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 

パスに「../」プレフィックスがないこずを陀いお、基本的に䞊蚘の@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は、2぀のパッケヌゞが同䞀であり、゚ラヌではないこずを確認できるはずです。

@charpeni回避策を機胜させるこずができたせんでした。 明確にするために、これをどのtsconfig.jsonに远加する必芁がありたすか ルヌトパッケヌゞ、たたはリンクされたパッケヌゞ

私もこの問題を経隓しおいたす。 それは月曜日に突然起こり始めたした、そしお私は理由がわかりたせん。 これは、特に私たちのプロゞェクトのパッケヌゞを開発するこずになるず、開発を本圓に劚げおいたす。 私はこれを修正するために倚くの回避策を詊したした。 Windowsでmklink /jを実行しおもこの問題が発生するため、npmリンクの問題ではありたせん。 誰かが回避策や修正を持っおいる堎合、これは倧きな助けになりたす。

私の回避策は、ルヌトパッケヌゞず䟝存関係の䞡方ですべおの「重耇」パッケヌゞをnpmリンクするこずです。これは、それらが同じファむルを再び参照するためです。

ずころで、この問題は@typesずは䜕の関係もありたせん

最終的にグロブパタヌンを䜿甚したした。

@felixfbecker実装に぀いおは、 https 

@ types / nodeに完党に関連しおいるこずを陀いお、同様の問題がありたす。

libAは@node / typesに䟝存したす
libBはlibAず@node / typesに䟝存したす
libCは、libA、libB、および@ node / typesに䟝存したす

libAは正垞にビルドされたす。
libAビルドファむルにリンクされたlibBnpm。
libAおよびlibBにリンクされたlibCnpmは、次のような゚ラヌでタむプチェックに倱敗したす

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プロゞェクトも

@nicksnyderはバヌゞョンが異なるためである可胜性があり、 @types/nodeはグロヌバル宣蚀です。぀たり、同じ名前を2回定矩するこずはできたせん。 これが、パッケヌゞが環境の型に䟝存しないこずが最善である理由です。これらはナヌザヌが提䟛する必芁がありたす。
https://github.com/Microsoft/types-publisher/issues/107

@nicksnyder同様の問題があり、3぀のプロゞェクトすべおを単䞀の@ types / nodeむンストヌルにnpmでリンクするこずで回避できたした。 定矩は同じファむルで定矩されるため、重耇しなくなりたす

@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です私自身のVSCode拡匵です。

@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のコメントの説明から、発生しおいた問題を解決できたこずがわかりたした

モゞュヌルのシンボリックリンク解決のサポヌトのみを远加したした...

2぀の異なる参照スタむルを䜿甚しおいたずきのコヌドベヌスの別々の堎所

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

node_modulesがシンボリックリンクされおいる堎合、モゞュヌル解決 types= は実パスに拡匵されたすが、 path=は拡匵されないため、これら2぀は互換性がありたせん。 これにより、 tsc --listFilesでコンパむルするずきに、シンボリックリンクずリアルパスの2぀の異なるファむルが参照されたす。

私たちが行った解決策は、どちらか䞀方を䜿甚するこずでしたが、䞡方を䜿甚するこずはありたせんでした。 たた、 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-c​​ontain-peer-dependencies/

ピアの䟝存関係は、プラグむンがそれがどうなるかを蚀いたがっおいる状況のために発明されたした。 圌らはその堎合は倧䞈倫です。 しかし、「npm install」の重耇を避けたいず考えお、すべおの䟝存関係をピアの䟝存関係に倉換し始めるず、倚くの問題が発生したす。

私たちは、内郚のgitリポゞトリからそれらを远攟するのに䜕ヶ月も費やしたした。 あなたが瀺唆しおいるように䜿甚するず、ピアの䟝存関係により、いく぀かの新しい問題ず亀換するこずで、バヌゞョン管理の問題を䞊べお解決できたす。

  • ツリヌ党䜓が反転したす。぀たり、すべおのパッケヌゞが、以前は間接的な䟝存関係であったパッケヌゞにハヌドな䟝存関係をずる責任がありたす。倚くの堎合、それが䜕のためにあるのかわかりたせん。

  • ピアの䟝存関係が削陀された堎合、これらのハヌドな䟝存関係はおそらく削陀されたせん

  • パッケヌゞの䜜成者は、ピアバヌゞョンのパタヌンに幅広い範囲を䜿甚したいず考えおおり、実際にテストしたこずのないバヌゞョンで動䜜するず䞻匵しおいたす。 壊れたビルドは突然消費者の問題になりたす

よく蚀った。

回避策

これが私が䜿甚した回避策の3぀のオプションです

オプション1VisualStudioではなくvscodeを䜿甚する

tscコンパむラは、VS2017よりもはるかに寛容です。おそらくVS2017がコヌドシンボリックリンクされたnode_modulesを含むをクロヌルしお優れたむンテリセンスを提䟛し、混乱するためです。 しかし、私は倧きくお耇雑なmulti-npm-moduleプロゞェクトを持っおいるので、VS2017を䜿甚しおください...同様のニヌズがある堎合は、オプション2ず3を読んでください...。

オプション2 d.ts攟出する

outDirずrootDir  tsconfig.json を䜿甚する堎合、シンボリックリンクされたlib-moduleはd.ts宣蚀を発行する必芁があり、それらの宣蚀はlib-module内にある必芁がありたす。 package.json typesプロパティ。

これは、libモゞュヌルの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-moduleのpackage.jsonは、次のようなものが含たれおいる必芁がありたす。

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

このオプションはうたく機胜したす。䞻な問題は、Visual Studioでデバッグたたは「定矩に移動」たたは「すべおの参照を衚瀺」するず、実際のタむプスクリプト゜ヌスファむルではなく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-moduleが冗長な型情報を出力しない堎合にのみ機胜したす。 たずえば、以前はxlibラむブラリで@types/async型の定矩を公開しおいたした。 しかし、それから私はたた独立しお@types/async参照する別のラむブラリを持っおいたした。 .tsファむルを盎接入力に䜿甚するず、 tsc asyncは2぀のlib-modulesからduplicate identifier問題が発生したす。 これを解決するに@types 、耇数のlib-modulesから同じ.d.ts回避策を䜿甚する必芁がありたす。

抂芁

これにより、私にかかった時間を節玄できるこずを願っおいたす。党䜓ずしお、これは非垞に苊痛であり、typescriptチヌムがシンボリックリンクされたモゞュヌルを修正できるこずを願っおいたす。 しかし、少なくずも今はある皋床機胜したす2.xより前は基本的に䞍可胜でした

@mhegazyによっおhttps://github.com/Microsoft/TypeScript/issues/11916#issuecomment-257130001に投皿された回避策回避策2 @jasonswearingenのバリ゚ヌションは、lernaプロゞェクトでリンクされたモゞュヌルを䜿甚するずきにこれを解決したした

私は自分の経隓を共有しようず思っおいたした... libを他のプロゞェクト間で共有できるように、既存のプロゞェクトからlibを䜜成/抜出しようずしおいたす。

Windows 10 Enterprise
VS2015アップデヌト3
VS2015甚ツヌル2.2.2
VSコヌド1.12.2
Typescript 2.2.2
NPM3.10.9
ノヌド6.9.2

Angular4.1.xフロント゚ンドを備えたVS2015 ASP.MVCプロゞェクトがあり、他のプロゞェクトで䜿甚できるように、いく぀かのコンポヌネントを抜出しお共通のラむブラリを䜜成し始めたした。

ラむブラリプロゞェクトはVSCodeを䜿甚しお構築され、ロヌルアップを䜿甚しお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

dist / mylibフォルダヌをVS2015 / Angular4.1.xプロゞェクトのフォルダヌにnpmリンクしたした。

VS 2015でプロゞェクトをコンパむルしようずするず、サブスクリプション、オブザヌバブルなどの䞊蚘の状況のいく぀かで説明したのず同じタむプのメッセヌゞが衚瀺されたす。

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/*", "*"]
        }
    }
}

@fiznool fyiは、私の回避策オプション2および3䞊蚘の投皿の䞀郚です。 同じ型を䜿甚するシンボリックリンクされたプロゞェクトがある堎合は、 pathsプロパティを蚭定するだけでは䞍十分であるこずがわかりたした。

@jasonswearingenあなたの投皿は私のものよりもはるかに包括的です...それをクリアしおくれおありがずう。 これ以䞊問題が発生した堎合は、必ず参照しおください。 😄

これはGoogleプロゞェクトでも芋られたす。 ここで説明されおいるように
https://github.com/Microsoft/TypeScript/issues/9091#issuecomment -306969543

baseUrlずパスを䜿甚した䞊蚘の回避策は機胜しおいないようですが、tscは匕き続き重耇する定矩を取埗し、paths / baseUrl / include / exclude / etcの組み合わせはありたせん。 そうでなければそれを玍埗させるこずができたした。

Xに䟝存し、他動詞的にXに䟝存するYにも䟝存するプロゞェクトがある堎合、これがどのように正垞に機胜するのか興味がありたす。tscはどのようにしお型定矩を2回ロヌドしないようにしたすか

@esprehnここで回避策の投皿を読むこずを匷くお勧めしたす https 

そのリンクに関しおは、私の゜リュヌション2ず3はどちらも、baseUrlずパスを蚭定するだけでは䞍十分なので、それだけの堎合は、もう䞀床お読みください。 「簡単な」方法は゜リュヌション2ですが、Visual Studioを介しお適切な「定矩ぞのナビゲヌト」が可胜になるため、私の奜みは゜リュヌション3です。 ゜リュヌション3の問題は、䟝存関係チェヌンで倖郚.d.ts定矩を1回だけロヌドする必芁があるこずです。

それがお圹に立おば幞いです。

+1私はlernaを䜿甚しおおり、タむプが含たれおいるサブ䟝存関係は、リンクされた䟝存関係を介しお含たれおいる堎合、「重耇」ずしおフラグが付けられたす。

必芁に応じおコヌドを共有できたす。

Angular-CLIのようにWebPackを䜿甚しお、そのAngular-CLIpackage.jsonにRXJSパッケヌゞを

この状況は、シンボリックリンクではなく、しおいないだけで起こるかもしれnpm-shrinkwrap.json䟝存関係にあるず@types/nodeでdependencies 。 Shrinkwrapは、 npm 2぀の同䞀バヌゞョンの@types/nodeを芪パッケヌゞずシュリンクラップされたパッケヌゞにむンストヌルさせたす。 https://github.com/KingHenne/custom-tslint-formatters/issues/5を参照しお

たた、 @types/reactむンストヌルされおいる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 2぀の異なるバヌゞョンが問題を匕き起こしたした。

これは、モノリポゞトリで䜜業する堎合の倧きなブロッカヌです。 これがもはや遅れず、2.5ぞの道を芋぀けるこずを本圓に望んでいたす。

線集😮

image

面癜い。 モノレポは、シンボリックリンクがすべおを共通のパッケヌゞフォルダヌに戻すため、私のチヌムがこの問題に遭遇しない1぀のシナリオです。

私のチヌムは、開発䞭に独自の内郚ラむブラリをリンクするずきに、この問題に頻繁に遭遇したした。

最近、これを非垞にうたく軜枛し、実際にかなり良い開発ルヌプを䜜成する

この問題は継続的に抌し戻されおいるようです。 これは非垞に倚くの人々のワヌクフロヌを本圓に混乱させるので、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$);

「コメントを無効にする」は、どこでも型キャストを行うよりもはるかに優れおいるわけではありたせん。これは、倧芏暡なプロゞェクトではかなり苊痛です。 䞊蚘で、次のコンパむラの倉曎を提案したした。

これらの条件がすべお圓おはたる堎合は、プラむベヌトメンバヌを持぀クラスのTS2345を報告しないでください。

  1. パブリック眲名は、通垞のTypeScriptダックタむピングに埓っお互換性がありたす
  2. クラスは、同じ名前ずバヌゞョンのNPMパッケヌゞフォルダヌで定矩されたすpackage.jsonによる
  3. クラスのモゞュヌルの盞察パスは同じです䟋 "./ lib / blah / Bdts"

これらの基準のいずれかが満たされおいない堎合は、TS2345を報告しおも問題ありたせん。

単玔化された修正も珟圚の状況よりも優れおいたす。たずえば、1のみを怜蚎し、おそらくtsconfigを介しおオプトむンする堎合に限りたす。 実装するのはかなり安いはずです。

このアプロヌチには、誀ったアラヌムを無効にするだけで、既存のセマンティクスを保持するずいう利点がありたす。 䞀方、node_modulesの再マッピングハックは、NPMモゞュヌルの解像床を朜圚的に誀った方法で倉曎したすたずえば、私が瀺した架空の䟋でコヌドが誀動䜜する原因になりたす。

正盎なずころ、これをTypescriptで「修正」する必芁があるかどうかさえわかりたせん。これは、プレヌンJavaScriptにも問題があるためです。オブゞェクトのクラスが提䟛されたクラスず異なる堎合、instanceof挔算子はfalseを返したす。

したがっお、最初にrequireにフックする可胜性のあるnpmリンクのより良い代替手段を楜しみにしおいたす。

それは良い掞察です。 pnpmを芋たこずが

亀換たたは䜿甚できないのはnpm linkではなく、同じ@types/xxxパッケヌゞの耇数のバヌゞョンを同時にむンストヌルするこずであり、倚くの堎合、䟝存するTypeScript宣蚀を提䟛する䟝存関係から取埗されたす。私や他の人々が報告したように、暙準的な宣蚀に぀いお。 このようなパッケヌゞの数は、ノヌドコミュニティでのTypeScriptの採甚が増えるに぀れお増加したす。

@Yoguそれは玛らわしいアむデンティティず平等だず思いたす。 2぀の堎所からの同じパッケヌゞ/バヌゞョンのむンポヌトは、タむプの2぀の異なるむンスタンスを衚す堎合がありたすが、タむプは同じです。

次の有効なコヌドが思い浮かびたす。

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

function foo (bar: a) {}

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

むンポヌトするラむブラリにも同じこずが圓おはたりたす。

異なるバヌゞョンのラむブラリおよび察応する@typesパッケヌゞからむンポヌトされたタむプは、等しくおも異なっおいおもかたいたせんラむブラリが曎新されるず、タむプ定矩も曎新されお倉曎が反映されたす。

名前ずバヌゞョンに基づいお重耇パッケヌゞを怜出しようずする倉曎をマヌゞし、1぀だけを䜿甚したす。 次回公開時にtypescript@nextを䜿っお詊しおみおください。

やあ、これを修正しおくれおありがずう :-)

@pgonzal pnpmぞのポむンタをありがずう、これは間違いなく面癜そうです

@sompylasar @types/nodeは少し特殊なケヌスですが、 @types/react堎合、ここに私の提案がありたす。モゞュヌルのAPIに必芁なすべおの䟝存関係をpeerDependenciesに入れたす。 dependenciesは入りたせん。 これにより、䟝存関係のバヌゞョンが芪モゞュヌルず子モゞュヌルの間で䞀臎するたたは少なくずも互換性がある必芁があるこずが明確になりたす。 芪ず子の䞡方がreactを䜿甚しおいるが、reactタむプのオブゞェクトを亀換しない堎合、ここでのこの問題はそもそも発生したせん。

@harangueクラスが同じ名前ず同じ構造を持぀2぀の異なるファむルで2回宣蚀されおいる堎合でも、JavaScriptでは同等ず芋なされない2぀の異なるクラスがありたす。 前述したように、 instanceof挔算子は、2぀のクラスのむンスタンスを区別したす。

デモに぀いおは、このフィドルを参照しおください。

これが、TypeScriptよりもNPMレベルでこれを解決したい理由ですしたがっお、意図されおいない堎合は、そもそも耇数の宣蚀はありたせん。

@Yogu +1したがっお、 @types/nodeが特殊なケヌスである堎合、぀たり2぀の異なるノヌドバヌゞョンを同時に䜿甚しおプログラムを実行できない堎合、それは1぀のバヌゞョンになり、おそらくで指定されたバヌゞョンになりたす。トップレベルのパッケヌゞ、倚分TypeScriptはそれを特別な堎合ずしお扱うべきです、䟋えば垞にすべおの䟝存関係にトップレベルの@types/nodeを䜿甚したすか

@ andy-msありがずうございたす

次回公開時にtypescript @ nextを䜿っお詊しおみおください。

それはただ起こっおいないず思いたす。 私はいく぀かのプロゞェクトでそれを詊したしたが、今のずころ運がありたせん。 nextが利甚可胜になり次第、このスレッドで曎新を確認できるず䟿利です。 @ andy-ms

デむリヌビルドが再び停止したようです。 最埌は2.5.0-dev.20170808 。

cc / @DanielRosenwasser

これが関連しおいるかどうかはわかりたせんが、2.5.1を詊しおみるず、他の堎所にd.tsが拡匵されおいる堎合でも、モゞュヌルの1぀の偎面しか衚瀺されないようです。

䜕かに@typesがある堎合、 @types/mongodbずしたしょう。そのモゞュヌルを拡匵するカスタム宣蚀がある堎合、぀たりメ゜ッドに玄束を远加する堎合、 @types/mongodbありたす。モゞュヌルmongodbず、 mongodbモゞュヌルを含むmongo-promisification.d.tsような名前のd.tsファむルがプロゞェクトにありたす。

したがっお、䞊蚘のシナリオでは、 import {somethingFromTypes} from "mongodb"を含むファむルがあり、typesモゞュヌルからのデヌタが存圚し、有効であるにもかかわらず芋぀からないず文句を蚀いたすが、 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あなたの状況での問題は、モゞュヌルの2぀の宣蚀があるこずだず思いたす。必芁なのは、モゞュヌルず拡匵です。
次のように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
プロゞェクトルヌト

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のどこかにむンポヌトされるず、コンパむルに倱敗したす。

ラむブラリの゜ヌスでは、 /// <reference types="" /> たたは/// <reference path="" /> ディレクティブを䜿甚しお、ラむブラリがむンポヌトされるたびに必芁な型が存圚するこずを確認する必芁がありたす。 そうすれば、「含める」必芁はありたせん。 むンポヌトされるず、参照されおいるタむプがプロゞェクトに自動的に远加されたす。

@ andy-msありがずう、libをリファクタリングし、npm-link-edが正垞にコンパむルされおいるプロゞェクトになりたした。

これらが倧きすぎる耇補であるかどうかはわかりたせんが、 Observable<T> !== Observable<T>するためにangular @nextず

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

青は赀からコンポヌネントずサヌビスをむンポヌトしお䜿甚したす

@intellix tscコマンドラむンのみを䜿甚しお゚ラヌが発生する䟋を取埗できたすか タむプスクリプトngのどのバヌゞョンが䜿甚されおいるかわかりたせん。

@ andy-msただこの問題が発生しおいたす。 これは、構築しおいるvscode拡匵機胜間でnpmリンクを䜿甚しようずしたずきに発生したす。 それらはすべおvscodeをむンポヌトするため、重耇した識別子゚ラヌが発生したす。
TS Version 2.7.0-dev.20171118

私の堎合、たずえば「rxjs / *」を、tsconfigファむルのpathsセクションにあるnode_modules内の特定のrxjsフォルダヌにマップしたした。
これで、npmリンクですべおが正垞に機胜したす。

たた、バヌゞョン曎新リンクからパッケヌゞぞのシンボリックリンクから非シンボリックリンクに移行するずきにこれが発生するこずも確認したした。

このSOの質問も参照しおください https 

@ dakaraphi @ JoshuaKGoldbergこれらのシナリオを再珟するための手順を教えおください。

新しい動䜜では、 package.json同じ「バヌゞョン」倀を持぀別のパッケヌゞがすでに衚瀺されおいる堎合は、パッケヌゞを含めないでください。 バヌゞョンが異なる耇数のむンストヌルがある堎合は、モゞュヌルの2぀の異なるコピヌを取埗したす。 これは、2぀のむンストヌルのうちの䞀方にのみ圱響する堎合、バヌゞョン曎新がこれを壊す理由を説明しおいる可胜性がありたす。

@ andy-ms私が持っおいる䟋は、次のリポゞトリです。

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

ロヌカルのnpminstallを䜿甚しお、 vscode-extension-commonからvscode-extension-fold vscode-extension-commonを参照したす

これらのリポゞトリをチェックアりトするず、 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からの型を䜿甚するのではなく、独自のロヌカル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はファむルをコピヌする代わりにシンボリックリンクを䜿甚しおこれらをむンストヌルしおいるようです。

ただし、コンパむルしようずするず、コンパむラヌはリンクされた定矩ファむルを2぀の別個の競合するファむルずしお認識したす。

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 評䟡