* Add new special assignment kinds for recognizing Object.defineProperty calls * Add support for prototype assignments, fix nits * Fix code review comments * Add test documenting behavior in a few more odd scenarios
68 lines
1.7 KiB
TypeScript
68 lines
1.7 KiB
TypeScript
// @allowJs: true
|
|
// @noEmit: true
|
|
// @strict: true
|
|
// @checkJs: true
|
|
// @filename: index.js
|
|
const x = {};
|
|
Object.defineProperty(x, "name", { value: "Charles", writable: true });
|
|
Object.defineProperty(x, "middleInit", { value: "H" });
|
|
Object.defineProperty(x, "lastName", { value: "Smith", writable: false });
|
|
Object.defineProperty(x, "zip", { get() { return 98122 }, set(_) { /*ignore*/ } });
|
|
Object.defineProperty(x, "houseNumber", { get() { return 21.75 } });
|
|
Object.defineProperty(x, "zipStr", {
|
|
/** @param {string} str */
|
|
set(str) {
|
|
this.zip = Number(str)
|
|
}
|
|
});
|
|
|
|
/**
|
|
* @param {{name: string}} named
|
|
*/
|
|
function takeName(named) { return named.name; }
|
|
|
|
takeName(x);
|
|
/**
|
|
* @type {number}
|
|
*/
|
|
var a = x.zip;
|
|
|
|
/**
|
|
* @type {number}
|
|
*/
|
|
var b = x.houseNumber;
|
|
|
|
const returnExemplar = () => x;
|
|
const needsExemplar = (_ = x) => void 0;
|
|
|
|
const expected = /** @type {{name: string, readonly middleInit: string, readonly lastName: string, zip: number, readonly houseNumber: number, zipStr: string}} */(/** @type {*} */(null));
|
|
|
|
/**
|
|
*
|
|
* @param {typeof returnExemplar} a
|
|
* @param {typeof needsExemplar} b
|
|
*/
|
|
function match(a, b) {}
|
|
|
|
match(() => expected, (x = expected) => void 0);
|
|
|
|
module.exports = x;
|
|
|
|
// @filename: validate.ts
|
|
// Validate in TS as simple validations would usually be interpreted as more special assignments
|
|
import x = require("./");
|
|
x.name;
|
|
x.middleInit;
|
|
x.lastName;
|
|
x.zip;
|
|
x.houseNumber;
|
|
x.zipStr;
|
|
|
|
x.name = "Another";
|
|
x.zip = 98123;
|
|
x.zipStr = "OK";
|
|
|
|
x.lastName = "should fail";
|
|
x.houseNumber = 12; // should also fail
|
|
x.zipStr = 12; // should fail
|
|
x.middleInit = "R"; // should also fail
|