-
Notifications
You must be signed in to change notification settings - Fork 13k
Closed
Closed
Copy link
Labels
Fix AvailableA PR has been opened for this issueA PR has been opened for this issueNeeds InvestigationThis issue needs a team member to investigate its status.This issue needs a team member to investigate its status.
Milestone
Description
Bug Report
The following factory methods, that got deprecated in 4.8, throw an "Invalid arguments" type error at runtime, if the body
parameter is not undefined
:
t.factory.createConstructorDeclaration(decorators, modifiers, parameters, body);
t.factory.updateConstructorDeclaration(ctor, decorators, modifiers, parameters, body);
🔎 Search Terms
Invalid arguments, createConstructorDeclaration, updateConstructorDeclaration
🕗 Version & Regression Information
- This changed between versions 4.7.4 and 4.8.0-dev.20220809
⏯ Playground Link
I don't think this can be reproduced in the playground.
Playground link with relevant code
💻 Code
To reproduce, you can:
$ mkdir repro
$ npm init --yes
$ npm install typescript@4.8.0-dev.20220809
Add the following code in a file index.js
. Then run node index.js
.
const ts = require('typescript');
const block = ts.factory.createBlock([]);
// works
const ctor = ts.factory.createConstructorDeclaration(
/* modifiers */ undefined,
/* parameters */ [],
/* body */ block,
);
// works
const _updatedCtorNewApi = ts.factory.updateConstructorDeclaration(
ctor,
/* modifiers */ ctor.modifiers,
/* parameters */ ctor.parameters,
/* body */ ctor.body,
);
// throws TypeError("Invalid arguments");
const _ctorOldApi = ts.factory.createConstructorDeclaration(
/* decorators */ undefined,
/* modifiers */ undefined,
/* parameters */ [],
/* body */ block,
);
// throws TypeError("Invalid arguments");
const _updatedCtorDeprecatedApi = ts.factory.updateConstructorDeclaration(
ctor,
/* decorators */ ctor.decorators,
/* modifiers */ ctor.modifiers?.filter(ts.isModifier),
/* parameters */ ctor.parameters,
/* body */ ctor.body,
);
🙁 Actual behavior
The deprecated functions createConstructorDeclaration and updateConstructorDeclaration throw an error at runtime. This makes it hard to write code, which works with both TypeScript 4.7 and 4.8.
🙂 Expected behavior
No error 🙂
🕵️ Cause
If I understand the deprecation function overload logic correctly, the issue is here:
(body === undefined || !isBlock(body)), |
(body === undefined || !isBlock(body)), |
This should use isBlock(body)
(without the negation).
Metadata
Metadata
Assignees
Labels
Fix AvailableA PR has been opened for this issueA PR has been opened for this issueNeeds InvestigationThis issue needs a team member to investigate its status.This issue needs a team member to investigate its status.