TypeScript/tests/cases/conformance/jsdoc/declarations/jsDeclarationsFunctionLikeClasses2.ts

82 lines
1.6 KiB
TypeScript
Raw Normal View History

Allow `allowJs` and `declaration` to be used together (#32372) * Allow allowJs and declaration to be used together This intorduces a new symbol-based declaration emitter - currently this is only used for JSON and JavaScript, as the output is likely worse than what the other declaration emitter is capable of. In addition, it is still incomplete - it does not yet support serializaing namespaces. * Add tests for various import/export forms, add notes on export as namespace and fix export * from * Tests & fixes for computed names * Add test with current @enum tag behavior * fix declaration emit for jsdoc @enum tags * Small adjustments to base class serialization to fix bugs in it * Guard against type/type parameter confusion when using typeParameterToName a bit * Integrate feedback from PR * Fix issue with export= declarations visibility calculation and type declaration emit that impacted all forms of declaration emit * Only make one merged getCommonJsExportEquals symbol for a symbol * Support preserving type reference directives in js declarations * Skip declare mdoifiers for namespace members in ambient contexts * FAKE ALIASES AND NAMESPACES EVERYWHERE * Dont do namespace sugar when type members contain keyword names * Fix json source file export modifier under new output * Such clean nested aliasing, very wow * Fix lint * Add visibility errors, reuse type nodes where possible * Suppoer having correctly named import types in bundled js declaration emit & adjust binding to allow namespaces with aliases to merge when the aliases look to be type-only * Better support for module.exports = class expression * Fix discovered crash bug * Allow export assigned class expressions to be reachable symbols from external declarations * Add missing semicolon * Support @enum tag post-merge * preserve comments on signatures and declarations where possible * Basic support for js classy functions * Add example we should do better with * Prototype assignments make things a bit wonky, but the example from the PR seems OK * Make a ton of changes to support the new way js classes are bound * Remove some old comments, fix import and export default names * Fix bug in object define handling and add tests for object define property declaration emit * Fix organization nits from PR comments * Preserve comments from jsdoc declarations on properties and js declaration type aliases * Merge export declarations with identical specifiers * Remove completed TODO comment * Split lint * Remove now-unused function * PR feedback * Add some project references tests, remove some checks from project refs codepaths that are now invalid * Update project references tests again * Merge and update project references tests * Rename case * Update test to include declaration output * Remove yet another project refernces redirect extension check * Update comment * Add additional import ref to test * Add shorthand prop to test * Fix comment text * Extract var to temp * Simplify function and add whitespace * Update project refs test to use incremental edit entry * Stylistic refactors in the symbol serializer * Another round of PR feedback, mostly style, small bugfix with constructors, and test showing bug in export assigned class expression name shadowing * Use x instead of index
2019-09-26 23:27:16 +02:00
// @allowJs: true
// @checkJs: true
// @target: es5
// @outDir: ./out
// @declaration: true
// @filename: source.js
/**
* @param {number} len
*/
export function Vec(len) {
/**
* @type {number[]}
*/
this.storage = new Array(len);
}
Vec.prototype = {
/**
* @param {Vec} other
*/
dot(other) {
if (other.storage.length !== this.storage.length) {
throw new Error(`Dot product only applicable for vectors of equal length`);
}
let sum = 0;
for (let i = 0; i < this.storage.length; i++) {
sum += (this.storage[i] * other.storage[i]);
}
return sum;
},
magnitude() {
let sum = 0;
for (let i = 0; i < this.storage.length; i++) {
sum += (this.storage[i] ** 2);
}
return Math.sqrt(sum);
}
}
/**
* @param {number} x
* @param {number} y
*/
export function Point2D(x, y) {
if (!(this instanceof Point2D)) {
return new Point2D(x, y);
}
Vec.call(this, 2);
this.x = x;
this.y = y;
}
Point2D.prototype = {
__proto__: Vec,
get x() {
return this.storage[0];
},
/**
* @param {number} x
*/
set x(x) {
this.storage[0] = x;
},
get y() {
return this.storage[1];
},
/**
* @param {number} y
*/
set y(y) {
this.storage[1] = y;
}
};
// @filename: referencer.js
import {Point2D} from "./source";
export const origin = new Point2D(0, 0);
// export const res = Point2D(2, 3).dot(origin); // TODO: when __proto__ works, validate this