Description
Bug Report
Deprecated factory methods aren't usable with originalNode.modifiers
.
#49089 changed Node.prototype.modifiers
from NodeArray<Modifier>
to NodeArray<Modifier | Decorator>
. It also changed factory functions to accept a single NodeArray<Modifier | Decorator>
argument instead of separate modifiers and decorators arguments. The old factory functions are still available (they are deprecated now). But I imagine most usages of those old functions now result in a compile error for passing in originalNode.modifiers
:
Argument of type 'NodeArray' is not assignable to parameter of type 'readonly Modifier[]'
🔎 Search Terms
4.8, modifiers, ModifiersArray, ModifierLike, decorators, Modifier, Decorator, factory
🕗 Version & Regression Information
- This changed between versions 4.7.4 and 4.8-beta
⏯ Playground Link
Playground link with relevant code
Note: Not sure how to reproduce this in the playground. import from "typescript"
doesn't seem to import nightly typings in the playground.
💻 Code
import * as ts from "typescript";
function transformClassDecl(orig: ts.ClassDeclaration) {
return ts.factory.updateClassDeclaration(
orig,
orig.decorators,
orig.modifiers,
// ^^^^^^^^^^^^^^ TS2345: Argument of type 'NodeArray<ModifierLike>' is not assignable to parameter of type 'readonly Modifier[]'.
orig.name,
orig.typeParameters,
orig.heritageClauses,
orig.members);
}
🙁 Actual behavior
This code snippet fails to compile with the error message inlined in the snippet.
🙂 Expected behavior
Ideally the deprecated factory.updateXxx
functions would still be usable as before. This would make the upgrade to TypeScript 4.8 easier.
I imagine most usages pass in originalNode.modifiers
unchanged, unless they modify the modifiers. Picking Angular as a random example:
Workarounds
We can change usages of factory functions to make code compatible with both TypeScript 4.7 and 4.8 by doing something like:
ts.factory.updateClassDeclaration(
orig,
orig.decorators,
orig.modifiers?.filter(ts.isModifier),
...
)