2015-06-23 01:18:35 +02:00
|
|
|
//// [classAbstractInstantiations2.ts]
|
|
|
|
class A {
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
|
|
|
abstract class B {
|
2015-06-23 20:30:30 +02:00
|
|
|
foo(): number { return this.bar(); }
|
2015-06-23 01:18:35 +02:00
|
|
|
abstract bar() : number;
|
|
|
|
}
|
|
|
|
|
|
|
|
new B; // error
|
|
|
|
|
|
|
|
var BB: typeof B = B;
|
|
|
|
var AA: typeof A = BB; // error, AA is not of abstract type.
|
|
|
|
new AA;
|
|
|
|
|
|
|
|
function constructB(Factory : typeof B) {
|
2015-06-23 22:30:10 +02:00
|
|
|
new Factory; // error -- Factory is of type typeof B.
|
2015-06-23 01:18:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var BB = B;
|
2015-06-23 22:30:10 +02:00
|
|
|
new BB; // error -- BB is of type typeof B.
|
2015-06-23 01:18:35 +02:00
|
|
|
|
|
|
|
var x : any = C;
|
|
|
|
new x; // okay -- undefined behavior at runtime
|
|
|
|
|
|
|
|
class C extends B { } // error -- not declared abstract
|
|
|
|
|
|
|
|
abstract class D extends B { } // okay
|
|
|
|
|
|
|
|
class E extends B { // okay -- implements abstract method
|
|
|
|
bar() { return 1; }
|
|
|
|
}
|
|
|
|
|
|
|
|
abstract class F extends B {
|
|
|
|
abstract foo() : number;
|
|
|
|
bar() { return 2; }
|
|
|
|
}
|
|
|
|
|
|
|
|
abstract class G {
|
|
|
|
abstract qux(x : number) : string;
|
|
|
|
abstract qux() : number;
|
|
|
|
y : number;
|
|
|
|
abstract quz(x : number, y : string) : boolean; // error -- declarations must be adjacent
|
|
|
|
|
2015-06-23 20:30:30 +02:00
|
|
|
abstract nom(): boolean;
|
|
|
|
nom(x : number): boolean; // error -- use of modifier abstract must match on all overloads.
|
2015-06-23 01:18:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
class H { // error -- not declared abstract
|
|
|
|
abstract baz() : number;
|
|
|
|
}
|
|
|
|
|
|
|
|
//// [classAbstractInstantiations2.js]
|
|
|
|
var __extends = (this && this.__extends) || function (d, b) {
|
|
|
|
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
|
|
|
function __() { this.constructor = d; }
|
|
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
|
|
};
|
|
|
|
var A = (function () {
|
|
|
|
function A() {
|
|
|
|
}
|
|
|
|
return A;
|
|
|
|
})();
|
|
|
|
var B = (function () {
|
|
|
|
function B() {
|
|
|
|
}
|
2015-06-23 20:30:30 +02:00
|
|
|
B.prototype.foo = function () { return this.bar(); };
|
2015-06-23 01:18:35 +02:00
|
|
|
return B;
|
|
|
|
})();
|
|
|
|
new B; // error
|
|
|
|
var BB = B;
|
|
|
|
var AA = BB; // error, AA is not of abstract type.
|
|
|
|
new AA;
|
|
|
|
function constructB(Factory) {
|
2015-06-23 22:30:10 +02:00
|
|
|
new Factory; // error -- Factory is of type typeof B.
|
2015-06-23 01:18:35 +02:00
|
|
|
}
|
|
|
|
var BB = B;
|
2015-06-23 22:30:10 +02:00
|
|
|
new BB; // error -- BB is of type typeof B.
|
2015-06-23 01:18:35 +02:00
|
|
|
var x = C;
|
|
|
|
new x; // okay -- undefined behavior at runtime
|
|
|
|
var C = (function (_super) {
|
|
|
|
__extends(C, _super);
|
|
|
|
function C() {
|
|
|
|
_super.apply(this, arguments);
|
|
|
|
}
|
|
|
|
return C;
|
|
|
|
})(B); // error -- not declared abstract
|
|
|
|
var D = (function (_super) {
|
|
|
|
__extends(D, _super);
|
|
|
|
function D() {
|
|
|
|
_super.apply(this, arguments);
|
|
|
|
}
|
|
|
|
return D;
|
|
|
|
})(B); // okay
|
|
|
|
var E = (function (_super) {
|
|
|
|
__extends(E, _super);
|
|
|
|
function E() {
|
|
|
|
_super.apply(this, arguments);
|
|
|
|
}
|
|
|
|
E.prototype.bar = function () { return 1; };
|
|
|
|
return E;
|
|
|
|
})(B);
|
|
|
|
var F = (function (_super) {
|
|
|
|
__extends(F, _super);
|
|
|
|
function F() {
|
|
|
|
_super.apply(this, arguments);
|
|
|
|
}
|
|
|
|
F.prototype.bar = function () { return 2; };
|
|
|
|
return F;
|
|
|
|
})(B);
|
|
|
|
var G = (function () {
|
|
|
|
function G() {
|
|
|
|
}
|
|
|
|
return G;
|
|
|
|
})();
|
|
|
|
var H = (function () {
|
|
|
|
function H() {
|
|
|
|
}
|
|
|
|
return H;
|
|
|
|
})();
|