CœurChris提出了一个问题：What's the difference between “declare class” and “interface” in TypeScript，或许与您遇到的问题类似。
interface is for when you simply want to describe the shape of an object. There's no code generation, ever, for interfaces -- they're solely an artifact in the type system. You'll see no difference in the code generation for a class depending on whether or not it has an
declare class is for when you want to describe an existing class (usually a TypeScript class, but not always) that is going to be externally present (for example, you have two .ts files that compile to two .js files and both are included via
script tags in a webpage). If you inherit from a
extends (regardless of whether the base type was a
declare class or a regular
class) the compiler is going to generate all the code to hook up the prototype chain and forwarding constructors and what not.
If you try to inherit from a
declare class that should have been an interface, you are going to have a runtime error because that generated code will be referring to an object with no runtime manifestation.
Conversely, if you simply
implement an interface that should have been a
declare class, you're going to have to re-implement all the members yourself and won't be taking advantage of any code re-use from the would-be base class, and functions that check the prototype chain at runtime will reject your object as not actually being an instance of the base class.
To get really nerdy, if you have a C++ background, you can roughly think of
declare class as an
extern declaration of a constructor that strictly lacks a definition in this compile unit.
From a pure consumption side (writing imperative code, not adding new types), the only difference between
declare class is that you can't
new an interface. However, if you intend to
implement one of these types in a new
class, you absolutely have to have chosen correctly between
declare class. Only one of them will work.
Two rules that will serve you well:
- Is the name of the type aligning with a constructor function (something invokable with
new) that's actually present at runtime (e.g.
JQueryStaticis not)? If no, you definitely want
- Am I dealing with a compiled class from another TypeScript file, or something sufficiently similar? If yes, use