borisyankov/DefinitelyTyped — pull request #133 by jamesmanning (2012-12-20 16:04:05+00:00)
Title: Need to 'declare' the Spinner class

In TypeScript 0.8.1.1, a 'declare' is needed in front of the 'class Spinner', since without it the compiler attempts to compile it as an actual class definition, and fails with:

Message: Overload declaration lacks definition
Line number: 27
Column number: 5
Source error:
Line 26: class Spinner {
Line 27: constructor (options?: SpinnerOptions);
-------------^
Line 28: spin(target?: any);

The test in the typescript codebase that confirms this is intentional behavior is in tests/compiler/class.ts

http://typescript.codeplex.com/SourceControl/changeset/view/2bee84410e02#tests/compiler/class.ts

****
describe('Testing function signatures inside classes', function () {
it('Regression test - was previously giving runtime error', function () {
var code = "class A { a(completed: () => any): void; }";
Harness.Compiler.compileString(code, 'fnsig-inside-classes', function (result) {
assert.compilerWarning(result, 1, 10, 'Overload declaration lacks definition');
assert.equal(result.errors.length, 1);
});
});
});
****

The compiler code that implements the check is in src/compiler/signatures.ts

http://typescript.codeplex.com/SourceControl/changeset/view/2bee84410e02#src/compiler/signatures.ts

****
if (!hasConstruct && !this.definitionSignature && this.signatures[i].declAST && this.signatures[i].declAST.isOverload && !hasFlag(this.signatures[i].declAST.fncFlags, FncFlags.Ambient)) {
checker.errorReporter.simpleError(this.signatures[i].declAST, "Overload declaration lacks definition");
}
****

By adding the 'declare', we tell the TypeScript compiler that this is just intending to expose the API of the class, not the actual implementation.