2

TypeScriptブランチでコンパイルしています(ここthree.d.tsから入手可能)。次のエラーが表示されます。develop

Types of static property 'Utils' of class 'THREE.Shape' and class 'THREE.Path'
are incompatible

問題はそれです

  • ShapeUtils静的クラスを定義します
  • Shape~を間接的に継承するCurve
  • CurveUtilsとは関係のない署名を持つ静的クラスも定義しますShape.Utils

言語仕様によると、これは形式が正しくありません。要約するとthree.d.ts、次のコードのようなものが含まれています。

declare class A {
   static Utils: {
      f (): any;
   }
}

declare class B extends A {
   static Utils: {
      // incompatible with A.Utils, without f(): any
      g (): any;
   }
}

なぜ静的メンバーの型が同じ名前の継承された静的メンバーの型と互換性がなければならないのかという問題はさておき - これは他のいくつかの OO 言語では当てはまらないが、TypeScript ではそうであるように見える -three.d.tsコンパイルできるように修正する方法を知りたいです。

Curve.Utils私の現在の回避策は、 の署名をにコピーして貼り付け、Shape.Utils後者が前者を構造的に拡張することです。three.jsしかし、ファイル内の基になるファイル ( here )の署名をキャプチャする「正しい」方法は何.d.tsですか? これは継承が間違って使用されている場合ですか?

4

1 に答える 1

2

簡単な答えは、仕様ごとに、C# が自動的に行うように、Typescript は継承によるメンバーの非表示を許可しないということです。

言語仕様セクション 8.2.3で定義されているとおり

派生クラスは、オーバーライドしない基本クラスからすべてのメンバーを継承します。継承とは、派生クラスが基本クラスのオーバーライドされていないすべてのメンバーを暗黙的に含むことを意味します。パブリック メンバーとプライベート メンバーの両方が継承されますが、オーバーライドできるのはパブリック メンバーのみです。派生クラスのメンバーが基本クラスのメンバーと同じ名前と種類 (インスタンスまたは静的) を持っている場合、派生クラスのメンバーは基本クラスのメンバーをオーバーライドすると言われます。オーバーライドするメンバーの型は、オーバーライドされるメンバーの型のサブタイプ (セクション 3.8.2) である必要があります。そうでない場合、コンパイル時エラーが発生します。

基本クラスの静的メンバーは、上記のように型に互換性がある限り、あらゆる種類の派生クラスの静的メンバーによってオーバーライドできます。

多分彼らは、以前は欠けていた最新のコンパイラバージョンにいくつかの型チェックを追加しました...

継承に基づく提案された解決策は次のとおりです。

declare class UtilsA{
    f():any;
}
declare class UtilsB extends UtilsA{
    g():any;
}

declare class A {
   static Utils:UtilsA;
}

declare class B extends A {
   static Utils:UtilsB;
}
于 2013-10-26T10:39:21.560 に答える