TypeScript Error Codes
Crack the code to your compiler problems with this ultimate list of common TypeScript errors. Each entry includes the faulty code and its fixed version, ensuring you can quickly resolve any issue and get back to coding.
Boost your productivity even further by installing the Pretty TypeScript Errors - VS Code Extension to see the error translations directly in your IDE.
All errors are categorized by the TypeScript team into the following ranges:
- 1xxx for syntactic errors
- 2xxx for semantic errors
- 4xxx for declaration emit errors
- 5xxx for compiler options errors
- 6xxx for command line errors
- 7xxx for type errors
The Ultimate Fix-it List:
- TS1002
- TS1005
- TS1006
- TS1015
- TS1016
- TS1029
- TS1035
- TS1036
- TS1038
- TS1039
- TS1046
- TS1054
- TS1055
- TS1056
- TS1064
- TS1066
- TS1068
- TS1070
- TS1095
- TS1099
- TS1103
- TS1107
- TS1109
- TS1117
- TS1121
- TS1127
- TS1128
- TS1149
- TS1155
- TS1160
- TS6133
- TS1163
- TS1175
- TS1183
- TS1192
- TS1196
- TS1202
- TS1208
- TS1218
- TS1219
- TS1225
- TS1228
- TS1232
- TS1240
- TS1241
- TS1243
- TS1244
- TS1247
- TS1248
- TS1254
- TS1259
- TS1274
- TS1280
- TS1308
- TS1309
- TS1323
- TS1337
- TS1341
- TS1345
- TS1355
- TS1357
- TS1361
- TS1363
- TS1368
- TS1371
- TS1375
- TS1378
- TS1385
- TS1389
- TS1431
- TS1432
- TS1434
- TS1450
- TS1470
- TS1471
- TS1479
- TS1484
- TS2300
- TS2304
- TS2305
- TS2306
- TS2307
- TS2314
- TS2315
- TS2318
- TS2322
- TS2335
- TS2339
- TS2341
- TS2344
- TS2345
- TS2348
- TS2349
- TS2350
- TS2351
- TS2352
- TS2353
- TS2355
- TS2361
- TS2362
- TS2364
- TS2365
- TS2366
- TS2367
- TS2368
- TS2369
- TS2370
- TS2371
- TS2372
- TS2377
- TS2378
- TS2383
- TS2389
- TS2390
- TS2391
- TS2393
- TS2394
- TS2395
- TS2397
- TS2403
- TS2411
- TS2415
- TS2416
- TS2420
- TS2425
- TS2428
- TS2430
- TS2440
- TS2445
- TS2448
- TS2451
- TS2454
- TS2456
- TS2459
- TS2475
- TS2476
- TS2488
- TS2491
- TS2497
- TS2498
- TS2503
- TS2504
- TS2507
- TS2511
- TS2512
- TS2515
- TS2528
- TS2531
- TS2532
- TS2533
- TS2536
- TS2537
- TS2538
- TS2539
- TS2540
- TS2550
- TS2551
- TS2552
- TS2554
- TS2556
- TS2558
- TS2559
- TS2561
- TS2564
- TS2567
- TS2571
- TS2574
- TS2577
- TS2580
- TS2582
- TS2583
- TS2584
- TS2588
- TS2589
- TS2595
- TS2604
- TS2611
- TS2612
- TS2613
- TS2614
- TS2616
- TS2617
- TS2632
- TS2636
- TS2637
- TS2638
- TS2652
- TS2654
- TS2656
- TS2661
- TS2663
- TS2664
- TS2665
- TS2668
- TS2669
- TS2674
- TS2677
- TS2678
- TS2680
- TS2683
- TS2684
- TS2686
- TS2687
- TS2688
- TS2689
- TS2691
- TS2693
- TS2694
- TS2695
- TS2705
- TS2706
- TS2707
- TS2709
- TS2713
- TS2715
- TS2717
- TS2720
- TS2722
- TS2724
- TS2730
- TS2732
- TS2739
- TS2740
- TS2741
- TS2742
- TS2749
- TS2769
- TS2774
- TS2779
- TS2786
- TS2790
- TS2792
- TS2794
- TS2802
- TS2813
- TS2814
- TS2820
- TS2821
- TS2823
- TS2834
- TS2835
- TS2845
- TS2855
- TS4010
- TS4020
- TS4023
- TS4025
- TS4031
- TS4055
- TS4060
- TS4063
- TS4075
- TS4081
- TS4104
- TS4111
- TS4112
- TS4113
- TS4114
- TS5023
- TS5024
- TS5025
- TS5042
- TS5054
- TS5055
- TS5058
- TS5069
- TS5070
- TS5083
- TS5087
- TS5093
- TS5095
- TS5097
- TS5101
- TS5110
- TS6053
- TS6059
- TS6133
- TS6138
- TS6192
- TS6196
- TS6198
- TS6234
- TS6385
- TS6387
- TS6504
- TS7005
- TS7006
- TS7008
- TS7009
- TS7010
- TS7016
- TS7017
- TS7022
- TS7023
- TS7026
- TS7027
- TS7029
- TS7030
- TS7031
- TS7034
- TS7038
- TS7041
- TS7044
- TS7053
- TS8020
- TS17000
- TS17004
- TS17009
- TS17019
- TS18003
- TS18004
- TS18016
- TS18026
- TS18028
- TS18046
- TS18047
- TS18048
- TS18049
- TS18052
- TS71002
- TS80001
- TS80005
TS1002
Unterminated string literal.
Broken Code ❌
Fixed Code ✔️
You have to close the string literal with an ending '
:
If you want to support multiline text, then you would have to use string concatenation:
Another solution would be using a template literal:
TS1005
'=' expected.
Broken Code ❌
Fixed Code ✔️
You need to assign your type declaration using the =
character:
Alternatively, you can declare an interface:
';' expected.
Broken Code ❌
Fixed Code ✔️
When using an arrow function expression, you can implicitly return values by wrapping the object literal in parentheses:
TS1006
A file cannot have a reference to itself.
Broken Code ❌
Fixed Code ✔️
You cannot reference a file to itself (causes recursive loop). To fix the problem you have to update the reference path to point to another declaration file:
TS1015
Parameter cannot have question mark and initializer.
Broken Code ❌
Fixed Code ✔️
TS1016
A required parameter cannot follow an optional parameter.
Broken Code ❌
Fixed Code ✔️
The easiest way to fix the error is to make age
optional as well:
Alternatively, you can flip the order of middleName
and age
. Be aware that this breaks the contract (signature) of the function and is considered a "breaking change":
You could also make middleName
non-optional:
Yet another solution would be to assign a default value to middleName
so it won't be optional by default. This allows age
to be optional then:
TS1029
'public' modifier must precede 'abstract' modifier.
Broken Code ❌
Fixed Code ✔️
They keywords public
, private
, and protected
define the access to a class member. Access modifiers have to be defined first in TypeScript.
Solution 1:
Solution 2:
The visibility is public
by default, so you don't have to explicitly declare it:
Video Tutorial
TS1035
Only ambient modules can use quoted names.
Broken Code ❌
Fixed Code ✔️
To turn a module into an ambient module, you have to prefix it with the declare
keyword:
TS1036
Statements are not allowed in ambient contexts.
Broken Code ❌
Fixed Code ✔️
With declare global
an ambient context is created. TypeScript does not allow statements in such ambient context declaration which is why we have to change the statement into a declaration:
If you don't want client
to be a function, you have to use the
var` keyword:
TS1038
A 'declare' modifier cannot be used in an already ambient context.
Broken Code ❌
Fixed Code ✔️
TS1039
Initializers are not allowed in ambient contexts.
Broken Code ❌
Fixed Code ✔️
Within a declaration file (ambient context), you should define types instead of implementing code. Consequently, you'll need to replace the initialization with a type annotation:
TS1046
Top-level declarations in .d.ts files must start with either a 'declare' or 'export' modifier.
Broken Code ❌
Fixed Code ✔️
If you want to export a constant from a definition file (d.ts
), then you have to use the export
modifier:
TS1054
TS1054: A
get
accessor cannot have parameters.
Broken Code ❌
Solution:
To fix this issue, you need to convert the get
accessor to a regular method since TypeScript does not allow parameters for getters. This change allows the method to accept arguments as required.
Fixed Code ✔️
TS1055
Type '
AxiosPromise
' is not a valid async function return type in ES5/ES3 because it does not refer to a Promise-compatible constructor value.
Broken Code ❌
Fixed Code ✔️
TS1056
Accessors are only available when targeting ECMAScript 5 and higher.
Broken Code ❌
Fixed Code ✔️
Set the "target" property in your "tsconfig.json" file to "es5" or higher:
TS1064
The return type of an async function or method must be the global Promise type. Did you mean to write 'Promise '?
Broken Code ❌
Fixed Code ✔️
If your function is asynchronous, your return value must be wrapped with Promise<...>
:
TS1066
In ambient enum declarations member initializer must be constant expression.
Broken Code ❌
Fixed Code ✔️
Try to replace your enum declaration with a type:
TS1068
Unexpected token. A constructor, method, accessor, or property was expected.
Broken Code ❌
Fixed Code ✔️
Functions that are part of a class are being called "method". The method of a class is defined without the function
keyword:
TS1070
'private' modifier cannot appear on a type member.
Broken Code ❌
Fixed Code ✔️
Interfaces are structures that define the public contract. This prohibits you from using private
modifiers. Only public
and protected
can be used. To solve the problem, the private
keyword must be removed from the name
property of the Animal
interface:
Video Tutorial
TS1095
A 'set' accessor cannot have a return type annotation.
Broken Code ❌
Fixed Code ✔️
You have to remove the return type from the "set" accessor:
TS1099
Type argument list cannot be empty.
Broken Code ❌
This error occurs because TypeScript does not allow empty type argument lists (<>
).
Fixed Code ✔️
The method response.json()
does not expect generic parameters to be provided. You don't need to provide any generic type parameters. Simply remove the empty type argument list (<>
) from the method call:
If you want to strongly type the result, you can cast it using as
:
TS1103
'for await' loops are only allowed within async functions and at the top levels of modules.
Broken Code ❌
Fixed Code ✔️
You have to mark your function with the async
keyword:
TS1107
Jump target cannot cross function boundary.
Broken Code ❌
Solution:
Replace break
with return
to exit the function when the condition is met:
Fixed Code ✔️
TS1109
Expression expected.
Broken Code ❌
Fixed Code ✔️
Any snippet of code that evaluates to a value is an expression. Any snippet of code that performs an action is a statement. We need a statement to throw an error inside:
TS1117
An object literal cannot have multiple properties with the same name in strict mode.
Broken Code ❌
Fixed Code ✔️
We can only have one value per property:
TS1121
Octal literals are not allowed. Use the syntax '
0o0
'.
Broken Code ❌
Solution:
Remove the extra zero to prevent the JavaScript interpreter from treating it as an octal literal.
Fixed Code ✔️
TS1127
Invalid character.
Broken Code ❌
Fixed Code ✔️
Unlike in Python, inline comments cannot begin with a single hash sign (#
) in TypeScript. You must use 2 slashes:
TS1128
Declaration or statement expected.
Broken Code ❌
Fixed Code ✔️
A declaration specifies the data and a statement specifies some action with that data:
TS1149
File name differs from already included file name only in casing.
Broken Code ❌
This error occurs when you import the same file in two different files using two different casing styles (ex. camelCase and UpperCamelCase):
File A:
File B:
Fixed Code ✔️
The error can be fixed by using the same casing style:
File A:
File B:
Alternatively, you can set forceConsistentCasingInFileNames
to false
in your "tsconfig.json" file:
TS1155
'const' declarations must be initialized.
Broken Code ❌
Fixed Code ✔️
Alternatively you can define a block-scoped local variable:
TS1160
Unterminated template literal.
Broken Code ❌
Fixed Code ✔️
This error is similar to TS1002 but refers to the ending of a template literal. To fix it, we have to close the template literal with an ending `
:
TS6133
Unterminated regular expression literal.
Broken Code ❌
Solution:
Correct the regular expression by removing the unnecessary escape before the 'g
' flag.
Fixed Code ✔️
TS1163
A '
yield
' expression is only allowed in a generator body.
Broken Code ❌
Fixed Code ✔️
You have to remove the yield
keyword from the for-of loop:
Broken Code ❌
Solution:
Add the *
symbol to define the function as a generator-async function, allowing yield
within its body.
Fixed Code ✔️
TS1175
'
implements
' clause already seen.
Broken Code ❌
Solution:
Remove the redundant implements Calculator
since ExtendedCalculator
already extends Calculator
.
Fixed Code ✔️
TS1183
An implementation cannot be declared in ambient contexts.
Broken Code ❌
Fixed Code ✔️
You cannot write a function implementation inside a declaration file (*.d.ts
). You can only declare its signature:
Alternatively, you can write your function implementation inside a source code file (*.ts
).
TS1192
Module '
json5
' has no default export.
Broken Code ❌
Fixed Code ✔️
When you are importing a module with built-in TypeScript declarations and TypeScript tells you that this module does not have a default export, then you can solve this problem by adding "allowSyntheticDefaultImports" to your "tsconfig.json" file and setting it to true
:
Module '
.../logdown
' has no default export.
Broken Code ❌
Fixed Code ✔️
'export *' does not re-export a default.
Broken Code ❌
You have to re-export a default (in this case coming from runWhenReady.ts
):
Fixed Code ✔️
TS1196
Catch clause variable type annotation must be 'any' or 'unknown' if specified.
Broken Code ❌
Fixed Code ✔️
Errors in catch clauses can only be typed with any
or unknown
. If you need a more precise error typing, you can use a type guard as follows:
Video Tutorial
TS1202
Import assignment cannot be used when targeting ECMAScript modules. Consider using 'import * as ns from "mod"', 'import {a} from "mod"', 'import d from "mod"', or another module format instead.
Broken Code ❌
Fixed Code ✔️
TS1208
'index.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module.
Broken Code ❌
Fixed Code ✔️
To solve the issue you can turn off "isolatedModules" in your "tsconfig.json". If you want to keep going with isolated modules, then you have to add an import or export to your code:
TS1218
Export assignment is not supported when '--module' flag is 'system'.
Broken Code ❌
Fixed Code ✔️
TS1219
Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option in your 'tsconfig' or 'jsconfig' to remove this warning.
Broken Code ❌
Fixed Code ✔️
Simply set "experimentalDecorators" to true
in your "tsconfig.json" file. As long as decorators are experimental you will also have to install the reflect-metadata package to shim the upcoming Metadata Reflection API for ECMAScript. For proper functionality the "emitDecoratorMetadata" option should also be set to true
.
TS1225
Cannot find parameter '
error
'.
Broken Code ❌
Fixed Code ✔️
A type predicate needs a parameter to validate:
TS1228
A type predicate is only allowed in return type position for functions and methods.
Broken Code ❌
Fixed Code ✔️
You have to separate the argument list from the return type definition by a :
:
TS1232
An import declaration can only be used at the top level of a namespace or module.
Broken Code ❌
Fixed Code ✔️
TS1240
Unable to resolve signature of property decorator when called as an expression. The runtime will invoke the decorator with 2 arguments, but the decorator expects 3.
Broken Code ❌
The problem is that the CatchError
decorator is defined as a method decorator but is being used as a property decorator.
Fixed Code ✔️
To fix this issue, turn the method into a property by removing the function
keyword:
TS1241
Unable to resolve signature of method decorator when called as an expression.
Broken Code ❌
This code throws an error because the decorator CatchError
is missing the correct signature for the PropertyDescriptor
.
Fixed Code ✔️
To fix this issue, update the signature for the decorator to include the _propertyKey
parameter:
With this adjustment, the CatchError
decorator now properly resolves the method signature, allowing you to catch and log errors as intended.
TS1243
'static' modifier cannot be used with 'abstract' modifier.
Broken Code ❌
You cannot define a function that is static
and abstract
. You have to keep it static
:
Fixed Code ✔️
'async' modifier cannot be used with 'abstract' modifier.
Broken Code ❌
Fixed Code ✔️
TS1244
Abstract methods can only appear within an abstract class.
Broken Code ❌
Fixed Code ✔️
TS1247
A type literal property cannot have an initializer.
Broken Code ❌
Fixed Code ✔️
The getName
function expects an object literal. However, in TypeScript, object literals are not allowed to have initializing functions or values. To work around this limitation and make use of an initializer, we can convert the object literal into a collective type:
TS1248
A class member cannot have the '
const
' keyword.
Broken Code ❌
Fixed Code ✔️
When inheriting from a base class, you have to use modifiers like readonly
if you want your class members to become constant:
TS1254
A 'const' initializer in an ambient context must be a string or numeric literal or literal enum reference.
Broken Code ❌
Fixed Code ✔️
TS1259
Module can only be default-imported using the 'esModuleInterop' flag
Broken Code ❌
Fixed Code ✔️
Note: You can enable the 'esModuleInterop' flag also via the CLI:
TS1274
'
in
' modifier can only appear on a type parameter of a class, interface or type alias.
Broken Code ❌
Solution:
Remove the in
and out
modifiers from the function type parameter.
Fixed Code ✔️
TS1280
Namespaces are not allowed in global script files when
verbatimModuleSyntax
is enabled. If this file is not intended to be a global script, setmoduleDetection
toforce
or add an emptyexport {}
statement.
Broken Code ❌
Fixed Code ✔️
Use a quotes around the name global
and turn it into an ambient module by using the declare module
syntax:
TS1308
'await' expressions are only allowed within async functions and at the top levels of modules.ts.
Broken Code ❌
Fixed Code ✔️
You cannot use an await
expression in an useEffect
hook, but you can use legacy Promise calls:
Alternatively, you can use an IIFE (Immediately-invoked Function Expression) in your useEffect
hook:
TS1309
TS1309: The current file is a CommonJS module and cannot use 'await' at the top level.
Broken Code ❌
Solution:
This error occurs because top-level await
is only supported in ECMAScript modules, not in CommonJS modules which are the default module system in Node.js unless specified otherwise.
To use top-level await
, you need to configure your project to use ECMAScript modules by adding "type": "module"
to your package.json
. This tells Node.js to treat all code files as ECMAScript modules.
Fixed Code ✔️
Another Solution:
To work around the restriction of not using await at the top level in a CommonJS module, you can also encapsulate your asynchronous operations within an Immediately Invoked Function Expression (IIFE) that is async:
TS1323
Dynamic imports are only supported when the '--module' flag is set to 'es2020', 'es2022', 'esnext', 'commonjs', 'amd', 'system', 'umd', 'node16', or 'nodenext'.
Broken Code ❌
Fixed Code ✔️
Dynamic imports are expressions that enable the loading of an ECMAScript module (ESM) into CommonJS modules (CJS).
The import()
expression also allow modules to be loaded conditionally on demand. This feature was introduced with the ECMAScript® 2020 Language Specification.
If your project uses an older module system, remember to update the module
setting in your TypeScript compiler settings.
TS1337
An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead.
Broken Code ❌
Fixed Code ✔️
Alternative:
An index signature parameter type cannot be a union type. Consider using a mapped object type instead.
Broken Code ❌
Fixed Code ✔️
Solution with mapped object type:
Alternative:
TS1341
Class constructor may not be an accessor.
Broken Code ❌
Fixed Code ✔️
You can't name accessors as constructor
:
TS1345
An expression of type '
void
' cannot be tested for truthiness.
Broken Code ❌
Solution:
This error occurs because the assertPositiveNumber
function is an assertion function and does not return a value (its return type is void
). You should call it directly to perform the assertion and then proceed with the divide
function if no error is thrown.
Fixed Code ✔️
TS1355
A 'const' assertions can only be applied to references to enum members, or string, number, boolean, array, or object literals.
Broken Code ❌
Fixed Code ✔️
You cannot apply a const assertion to the result of a ternary operator. It is necessary to restrict the usage of const assertions to the individual literal expressions:
TS1357
An enum member name must be followed by a '
,
', '=
', or '}
'.
Broken Code ❌
Fixed Code ✔️
TS1361
'
Range
' cannot be used as a value because it was imported using 'import type'.
Broken Code ❌
Fixed Code ✔️
The type Range
is being used to declare the return type of static function Ranger.getFullRange
but later on it is also being used to create an instance using new Range
. When you want to use a type to construct instances (or do anything else beyond declaring types), then you have to use the import
statement instead of import type
:
TS1363
A type-only import can specify a default import or named bindings, but not both.
Broken Code ❌
Fixed Code ✔️
With type-only imports and exports you cannot use a default import together with a named import in one single line of code. The TypeScript team chose this limitation to avoid ambiguity. You will have to use separate import statements:
TS1368
Class constructor may not be a generator.
Broken Code ❌
Fixed Code ✔️
You can't name generators as constructor
:
TS1371
This import is never used as a value and must use 'import type' because 'importsNotUsedAsValues' is set to 'error'.
Broken Code ❌
Fixed Code ✔️
Solution 1:
When "importsNotUsedAsValues" is set to "error" in your "tsconfig.json", then you have to use the "import type" syntax when you just want to refer to a type instead of using it as a value:
Solution 2:
Use the class also as a value and not just a type:
Solution 3:
You can also set "importsNotUsedAsValues" to "preserve" which is not recommended.
TS1375
'await' expressions are only allowed at the top level of a file when that file is a module, but this file has no imports or exports. Consider adding an empty 'export {}' to make this file a module.
Broken Code ❌
Fixed Code ✔️
TS1378
Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', or 'nodenext', and the 'target' option is set to 'es2017' or higher.
Broken Code ❌
Fixed Code ✔️
TS1385
Function type notation must be parenthesized when used in a union type.
Broken Code ❌
Fixed Code ✔️
When using a union type, you have to put additional function types in parentheses:
TS1389
'this' is not allowed as a variable declaration name.
Broken Code ❌
Fixed Code ✔️
The name this
cannot be used to declare a variable because it is already a reserved keyword to refer to the current object in a method or constructor.
That's why you have to choose a different name:
TS1431
'for await' loops are only allowed at the top level of a file when that file is a module, but this file has no imports or exports. Consider adding an empty 'export {}' to make this file a module.
Broken Code ❌
Fixed Code ✔️
Just add the imports for the fs
module and readline
module in order to turn your code into a module itself:
TS1432
Top-level 'for await' loops are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', or 'nodenext', and the 'target' option is set to 'es2017' or higher.
Broken Code ❌
Fixed Code ✔️
The error is similar to TS1378 and needs an adjustment in the tsconfig.json
file:
TS1434
Unexpected keyword or identifier.
Broken Code ❌
Fixed Code ✔️
You have to remove the duplicate static
keyword:
TS1450
Dynamic imports can only accept a module specifier and an optional set of attributes as arguments.
Broken Code ❌
This error occurs because the TypeScript compiler expects a dynamic import as the imported module is assigned to a constant.
Fixed Code ✔️
To fix this error, use an import statement to indicate to the compiler that a module is being imported:
TS1470
The '
import.meta
' meta-property is not allowed in files which will build into CommonJS output.
Broken Code ❌
Solution:
Since import.meta
is not allowed when targeting CommonJS, you need to use an alternative method to determine the directory path. In a CommonJS environment, you can use the built-in __dirname
global variable directly without needing to calculate it from __filename
.
Fixed Code ✔️
TS1471
Module '
@headlessui/react
' cannot be imported using this construct. The specifier only resolves to an ES module, which cannot be imported synchronously. Use dynamic import instead.
Broken Code ❌
Fixed Code ✔️
Using a dynamic import:
TS1479
The current file is a CommonJS module whose imports will produce '
require
' calls; however, the referenced file is an ECMAScript module and cannot be imported with 'require
'. Consider writing a dynamic 'import()
' call instead.
Broken Code ❌
Solution:
To import an ECMAScript module in a CommonJS module, you can use a dynamic import which works asynchronously and returns a Promise.
Fixed Code ✔️
TS1484
ContentCollectionKey
is a type and must be imported using a type-only import whenverbatimModuleSyntax
is enabled.
Broken Code ❌
Fixed Code ✔️
Type-only imports can be made using the type
keyword in front of your type's name:
TS2300
Duplicate identifier 'name'.
Broken Code ❌
Objects don't support multiple properties with the same name:
Fixed Code ✔️
To fix the error we have to remove the duplicated property:
TS2304
Cannot find name 'world'.
Broken Code ❌
Fixed Code ✔️
It can happen that TypeScript does not know about your global objects because those may be injected from an unknown runtime environment or third-party JavaScript library. The easiest way to let TypeScript know about this is to declare the ambience (ambient context):
Cannot find name 'Promise'
Broken Code ❌
Fixed Code ✔️
Install es6-promise
type definitions with the typings tool.
Adding the following line to the beginning of every file using definitions from es6-promise
.
Cannot find name 'Promise'
Broken Code ❌
Fixed Code ✔️
Cannot find name 'FC'.
Broken Code ❌
Fixed Code ✔️
TS2305
Module '
./sum
' has no exported member 'multiply
'.
Broken Code ❌
Fixed Code ✔️
The file "sum.ts" exports a function named "sum", so we have to fix the named import in our "main.ts" file:
TS2306
File '
add.ts
' is not a module.
Broken Code ❌
Fixed Code ✔️
The error TS2306 signals that the file (add.ts
) can be found (otherwise it would throw error TS2307) but does not provide the necessary exports. We can solve this with a named export:
Alternatively, we can use a default export:
Using a default export requires that we also adjust our import statement in main.ts
(otherwise we would end up with error TS2614):
Video Tutorial
TS2307
Cannot find module 'events' or its corresponding type declarations.
Broken Code ❌
You are importing from a core Node.js module (e.g. event
) without having Node.js type definitions installed:
Fixed Code ✔️
Import Node.js type definitions first in order to use Node.js core modules:
Read More: Cannot find module events
TS2314
Generic type '
Omit
' requires 2 type argument(s).
Broken Code ❌
Fixed Code ✔️
When using the Omit
utility type, you have to list property overwrites with a pipe (|
):
Generic type '
ReadonlyArray
' requires 1 type argument(s).
Broken Code ❌
Fixed Code ✔️
When using a generic (in this case ReadonlyArray<T>
), then you have to pass a type argument to it:
TS2315
Type '
CustomRequest
' is not generic.
Broken Code ❌
Fixed Code ✔️
When supplying a type (recognizable by the use of the diamond operator <>
), then we have to make sure that our type actually supports generics to capture the type that we provide:
TS2318
TS2318: Cannot find global type '
AsyncIterableIterator
'.
Broken Code ❌
Solution:
This issue is often related to the TypeScript configuration not including the necessary libraries that define modern JavaScript features like AsyncIterableIterator
. To ensure that TypeScript supports Symbol.asyncIterator
properly, your TypeScript configuration needs to either target esnext
or explicitly include the esnext
.asynciterable library if you're using a targeted subset of features from ECMAScript proposals.
Fixed Code ✔️
TS2322
Type 'string' is not assignable to type 'number'.
Broken Code ❌
Fixed Code ✔️
The type of the returned value must match the return type specified in the function signature:
Video Tutorial
TS2335
'super' can only be referenced in a derived class.
Broken Code ❌
Fixed Code ✔️
Your derived class has to "extend" the base class:
TS2339
Property '
width
' does not exist on type 'Shape
'.
Broken Code ❌
Fixed Code ✔️
You can create discriminated unions by sharing a single field (e.g. kind
) in your type definitions and using a union type in connection with a switch-case statement that helps the TypeScript compiler to distinguish the different types:
Property '
pop
' does not exist on type 'readonly [1, 2, 3]
'.
Broken Code ❌
When using a const assertion on an array, then your array becomes readonly (immutable), so you cannot modify its elements using in-place operations such as pop
. You will have to make your array mutable:
TS2341
Property '
startSimulation
' is private and only accessible within class 'ExchangeMock
'.
Broken Code ❌
Solution:
Access the private property startSimulation
using bracket notation, which is a workaround to access private members from outside the class in TypeScript.
Fixed Code ✔️
TS2344
Type '
{ name: string; }
' does not satisfy the constraint '{ age: number; }
'. Property 'age
' is missing in type '{ name: string; }
' but required in type '{ age: number; }
'.
Broken Code ❌
Fixed Code ✔️
The "constraint" in this context is set by the T extends
statement. When passing a type argument, the required properties of the type variable (T
) must be matched:
As an alternative, type argument inference can be used:
TS2345
Argument of type '
number
' is not assignable to parameter of type 'TimerHandler
'.
Broken Code ❌
Fixed Code ✔️
There is a mismatch in the expected arguments of a function. The setTimeout
function expects the first argument to be a callback function and not the returned value (in this case a number
) of a function call:
Video Tutorial
TS2348
Value of type 'typeof BaseN' is not callable. Did you mean to include 'new'?
Broken Code ❌
Fixed Code ✔️
TS2349
Cannot invoke an expression whose type lacks a call signature. Type 'Promise
' has no compatible call signatures.
Broken Code ❌
Fixed Code ✔️
TS2350
Only a void function can be called with the '
new
' keyword.
Broken Code ❌
This error occurs because NextResponse.json()
is a static method and not a constructor. Therefore, it shouldn't be used with the new
keyword.
Fixed Code ✔️
Remove the new
keyword when calling NextResponse.json()
:
This way, you're correctly invoking the static method without trying to instantiate it.
TS2351
This expression is not constructable. Type '
EMA
' has no construct signatures.
Broken Code ❌
Fixed Code ✔️
TS2352
Conversion of type '
{ name: string; age: number; }
' to type 'Person
' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown
' first.
Broken Code ❌
Fixed Code ✔️
Make sure all properties of your object match the properties of your declared type:
Alternative but not recommended: Convert your object to unknown
first:
TS2353
TS2353: Object literal may only specify known properties, and '
id
' does not exist in typeOmit<VideoEntity, 'id'>
.
Broken Code ❌
Solution:
In the broken code, you are trying to set the id
property on an instance of VideoEntity
where id
has been explicitly removed from the permissible properties through the use of Omit<VideoEntity, 'id'>
.
Remove the id
property from the object literal since it has been omitted from the type definition you are trying to conform to.
Fixed Code ✔️
TS2355
A function whose declared type is neither 'void' nor 'any' must return a value.
Broken Code ❌
Fixed Code ✔️
TS2361
The right-hand side of an 'in' expression must not be a primitive.
Broken Code ❌
Fixed Code ✔️
You cannot use the in
keyword on primitive data types. That's why we have to replace the primitive type unknown
with a non-primitive type like object
:
An alternative solution would be to use a type assertion on the right-hand side of the 'in' expression:
TS2362
The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
Broken Code ❌
Fixed Code ✔️
When you want to merge two objects, you have a multitude of possibilities:
Spread Syntax
Object.assign
TS2364
The left-hand side of an assignment expression must be a variable or a property access.
Broken Code ❌
Fixed Code ✔️
Using a variable on the left-hand side assignment:
TS2365
Operator '+' cannot be applied to types 'number' and 'object'.
Broken Code ❌
Fixed Code ✔️
You can use the +
operator only with equivalent data types (strings + strings or numbers + numbers):
TS2366
Function lacks ending return statement and return type does not include 'undefined'.
Broken Code ❌
Fixed Code ✔️
The switch-case statement isn't handling all cases from every possible input. We can solve that by defining a default
case:
Another solution would be to implement the missing case for 3
:
Video Tutorial
TS2367
This condition will always return 'false' since the types '{ message: string; }[] | undefined' and 'number' have no overlap.
Broken Code ❌
Fixed Code ✔️
An array cannot be 0
, so doing a check for equality with 0
makes no sense. What may be useful instead is checking the array length:
TS2368
Type parameter name cannot be 'number'.
Broken Code ❌
Fixed Code ✔️
The easiest way to fix the error is to make age
optional as well:
TS2369
A parameter property is only allowed in a constructor implementation.
Broken Code ❌
Fixed Code ✔️
The constructor implementation is missing curly brackets which is why TypeScript does not recognize the constructor implementation and files error TS2369. To solve it you have to add the missing curly brackets:
TS2370
A rest parameter must be of an array type.
Broken Code ❌
Fixed Code ✔️
A rest parameter allows a function to accept an indefinite number of parameters. To signal that it can be multiple values, we have to use an array
type for our rest parameter:
TS2371
A parameter initializer is only allowed in a function or constructor implementation.
Broken Code ❌
Fixed Code ✔️
Remove parameter initializer from function overload:
TS2372
Parameter '
score
' cannot reference itself.
Broken Code ❌
Fixed Code ✔️
If you want to use a default value for a parameter, then you have to set it to a fixed value instead of referencing the parameter to itself:
TS2377
Constructors for derived classes must contain a 'super' call.
Broken Code ❌
Fixed Code ✔️
Every constructor
in a derived class has to call the super
method to invoke the constructor
of the base class. It has to be the very first call:
Video Tutorial
TS2378
A 'get' accessor must return a value.
Broken Code ❌
Fixed Code ✔️
TS2383
TS2383: Overload signatures must all be exported or non-exported.
Broken Code ❌
Solution:
This TypeScript error occurs because the function overloads for isTuple
are internally defined (not exported), but the implementation signature is exported. This discrepancy between the visibility of the overload signatures and the implementation signature leads to the error.
To fix this error, you need to ensure consistent export status for all overload signatures and the function implementation. You can either export all the overload signatures or keep them all internal. In most cases, if you intend to use the function outside the module, you should export everything.
Fixed Code ✔️
TS2389
Function implementation name must be '
getOpenPosition
'.
Broken Code ❌
Solution:
Rename getOrder
to getOpenPosition
to match the declared method signatures.
Fixed Code ✔️
TS2390
Constructor implementation is missing.
Broken Code ❌
Fixed Code ✔️
A constructor implementation must be put in curly brackets:
TS2391
Function implementation is missing or not immediately following the declaration.
Broken Code ❌
Fixed Code ✔️
An abstract class is different from an interface. You have to use the abstract
modifier if you want to define a contract in an abstract class. If there is no abstract
modifier you will have to provide a implementation.
Solution 1:
To solve the problem, we can mark makeNoise
with the abstract
keyword. That will enforce derived classes to implement this method on their own:
Solution 2:
Another solution is to provide a base implementation for makeNoise
:
Video Tutorial
TS2393
Duplicate function implementation.
Broken Code ❌
Fixed Code ✔️
This error may occur when you have multiple files within the same project that implement the same function with the same name. To resolve this issue, you need to configure TypeScript to recognize a file as a script rather than a module. This can be achieved by setting the "moduleDetection" option to "force" instead of the default "auto":
TS2394
This overload signature is not compatible with its implementation signature.
Broken Code ❌
The implementation does not match all signatures:
Fixed Code ✔️
To match the first function overload, we have to add code to our function body which can also return a number
:
Video Tutorial
TS2395
Individual declarations in merged declaration '
React
' must be all exported or all local.
Broken Code ❌
Fixed Code ✔️
Make sure to export your additional declaration:
TS2397
Declaration name conflicts with built-in global identifier '
globalThis
'.
Broken Code ❌
Fixed Code ✔️
To merge your additions with the existing globalThis
definition, you can use a namespace:
TS2403
TS2403: Subsequent variable declarations must have the same type. Variable '
window
' must be of type 'Window & typeof globalThis
', but here has type 'any
'.
Broken Code ❌
Fixed Code ✔️
TS2411
Property 'age' of type 'number' is not assignable to 'string' index type 'string'.
Broken Code ❌
Fixed Code ✔️
We defined an interface where every key
has a value of type string
. This doesn't work for age
which is why we have to extend the possible value types using a union type:
TS2415
TS2415: Class
PanicSellStrategy<Config>
incorrectly extends base classStrategy<Config, StrategyState>
. Propertyposition
is private in typePanicSellStrategy<Config>
but not in typeStrategy<Config, StrategyState>
.
Broken Code ❌
Solution:
To resolve the TS2415 error, ensure the visibility of the position
property in the derived class PanicSellStrategy
matches that of the base class Strategy
. If the base class has position
as protected
, the derived class should also declare it as protected
or more accessible (not private
).
Fixed Code ✔️
TS2416
Property
myVariable
in typeMyExtendedClass
is not assignable to the same property in base typeMyBaseClass
. Typenumber
is not assignable to typestring
.
Broken Code ❌
Fixed Code ✔️
When referring to an inherited property (like myVariable
), make sure that it uses the same type as the original:
TS2420
Class 'Dog' incorrectly implements interface 'Animal'. Property 'name' is private in type 'Dog' but not in type 'Animal'.
Broken Code ❌
Fixed Code ✔️
The Animal
interface defines a public name
member. The name
property in our Dog
class must therefore also be public:
Video Tutorial
TS2425
Class
MyBaseClass
defines instance member propertylogMyVariable
, but extended classMyExtendedClass
defines it as instance member function.
Broken Code ❌
Fixed Code ✔️
To turn a function into a property of an instance member, you can use a class property initializer:
TS2428
All declarations of '
Strategy
' must have identical type parameters.
Broken Code ❌
Fixed Code ✔️
Solution: The generic abstract class Strategy
has a generic type parameter list in angle brackets (diamond notation). This generic type parameter list must also be added to the interface definition of Strategy
.
TS2430
Interface '
StockExchange
' incorrectly extends interface 'Exchange
'.
Broken Code ❌
Fixed Code ✔
The address
in Exchange
is a mandatory property but in StockExchange
it is declared as being optional which creates an incompatibility in the type. To fix the error, the property address
has either to become optional or mandatory in both declarations:
TS2440
Import declaration conflicts with local declaration of '
React
'.
Broken Code ❌
Fixed Code ✔️
You cannot redeclare a module that you are importing, but you can outsource your additional typings to a declaration file in order to apply declaration merging:
TS2445
Property 'makeNoise' is protected and only accessible within class 'Dog' and its subclasses.
Broken Code ❌
Fixed Code ✔️
The visibility of the makeNoise
method is protected. We have to make it public if we want to call it directly from an instance of Dog
:
Video Tutorial
TS2448
Block-scoped variable 'add' used before its declaration.
Broken Code ❌
Function expressions cannot be hoisted (used before they are declared):
Fixed Code ✔️
Turn your function expression into a function declaration (which can be hoisted):
TS2451
Cannot redeclare block-scoped variable '
window
'.
Broken Code ❌
Fixed Code ✔️
Depending on the configuration of "lib" in your "tsconfig.json" file, there might be global variables that are present (like window
when using the "dom" library provided by TypeScript). In this case you cannot redeclare the global variable and have to choose another name:
TS2454
Variable 'myFavoriteNumber' is used before being assigned.
Broken Code ❌
Fixed Code ✔️
or
TS2456
Type alias '
MyValue
' circularly references itself.
Broken Code ❌
Fixed Code ✔️
When defining a recursive type, you have to use the object syntax:
TS2459
Module '
./myFunction
' declares 'myFunction
' locally, but it is not exported.
Broken Code ❌
Fixed Code ✔️
When you want to import your function in another file, you have to make sure that it is exported using the export
keyword:
TS2475
'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment or type query.
Broken Code ❌
Fixed Code ✔️
Defining a const enum
prevents TypeScript from generating JavaScript code for this enum. With const enum
TypeScript will just assume that the JavaScript equivalent of this code is already present.
If you want that TypeScript creates JS code for your enum definition, then you have to remove the const
keyword:
TS2476
A const enum member can only be accessed using a string literal.
Broken Code ❌
Fixed Code ✔️
Constant enumerations can only be accessed using key names:
If you want to access enums by indices, you must remove the const
keyword and values from your enum
:
⚠️ Be aware that this may become unsafe as you may unintentionally access indices that are not defined.
TS2488
Type '
{ [month: number]: string; }
' must have a '[Symbol.iterator]()
' method that returns an iterator.
Broken Code ❌
Fixed Code ✔️
The simplest way to loop over an object is to create an iterable object by using Object.entries
.
Another method is to add a property called [Symbol.iterator]
to your object. The value of this property has to return an iterator. Here you can learn how to create an iterator.
TS2491
The left-hand side of a '
for...in
' statement cannot be a destructuring pattern.
Broken Code ❌
Solution:
Change the for...in
loop to a for...of
loop to correctly iterate over entries of an object using destructuring.
Fixed Code ✔️
TS2497
Module '
logdown
' resolves to a non-module entity and cannot be imported using this construct.
Broken Code ❌
Export: logdown.d.ts
Import: app.ts
Broken Code ❌ #2
Export
Import
Note: TypeScript compiler option "allowSyntheticDefaultImports" must be set to true
.
Import
TS2498
Module
'node_modules/@types/ms/index'
usesexport =
and cannot be used withexport *
Broken Code ❌
index.ts
Fixed Code ✔️
If a third-party module uses a default export (indicated by the export =
syntax), you must use the default
keyword to re-export this module:
TS2503
Cannot find namespace '
React
'.
Broken Code ❌
Fixed Code ✔️
You have to add an import statement when reusing a different namespace. Also make sure to install type declarations (i.e. @types/react
) if needed.
Cannot find name 'process'. Do you need to install type definitions for node? Try
npm i --save-dev @types/node
.
Solution
Run yarn add --dev @types/node
in your npm project.
TS2504
Type '
Promise<ResponseData>
' must have a '[Symbol.asyncIterator]()
' method that returns an async iterator.
Broken Code ❌
Fixed Code ✔️
Make sure that fetchDataGenerator
returns an AsyncGenerator
. When using the function*
syntax, this will be the case:
TS2507
Type '
typeof EventEmitter
' is not a constructor function type.
Error happened when importing the exported class in another project.
Broken Code ❌
Fixed Code ✔️
TS2511
Cannot create an instance of an abstract class.
Broken Code ❌
Fixed Code ✔️
Read more: Passing a class constructor as parameter to a function.
TS2512
Overload signatures must all be abstract or non-abstract.
Broken Code ❌
Fixed Code ✔️
TS2515
Non-abstract class 'Dog' does not implement inherited abstract member 'makeNoise' from class 'Animal'.
Broken Code ❌
Fixed Code ✔️
If we derive a class from an abstract class, then we have to provide an implementation for all its abstract
members:
Video Tutorial
TS2528
A module cannot have multiple default exports.
Broken Code ❌
Fixed Code ✔️
Make sure to only have one default export:
TS2531
Object is possibly 'null'.
Broken Code ❌
Fixed Code ✔️
The error originates from the fact that address
can be null
. To fix the problem, we can check if address
is null
by using optional chaining:
TS2532
Object is possibly 'undefined'.
Broken Code ❌
Fixed Code ✔️
TypeScript warns us that person
can be undefined
(because of the ?
). There are multiple ways to fix the problem. We can do an existence check using an if
-condition:
Alternatively, we can use optional chaining:
Optional chaining is less preferable in this case as it will log undefined
if the person
is undefined
. Using the if
-condition from the solution above, nothing will be logged to the console in case the person
is undefined
.
Suppressing the error
You can prevent the error by setting the value of "strictNullChecks" to false
in the "compilerOptions" section of your "tsconfig.json" file.
TS2533
Object is possibly 'null' or 'undefined'.
Broken Code ❌
Fixed Code ✔️
The error originates from the fact that address
can be undefined
(because of the ?
) or null
. To fix the problem, we can check if address
is defined by using optional chaining:
TS2536
Type
string
cannot be used to index typeConfig
Broken Code ❌
Fixed Code ✔️
Because the type of property
is a string
and Config
expects a ConfigKey
, we need to ensure that our property
is of type ConfigKey
.
We can simply annotate the ConfigKey
type to property
, but we also have to make sure that ConfigKey
extends the string
type as the set method of a Proxy only accepts string | symbol
:
TS2537
Type '
Promise<OctokitResponse<{ name?: string | null | undefined; email?: string | null | undefined; login: string; id: number; node_id: string; avatar_url: string; gravatar_id: string | null; url: string; html_url: string; ... 11 more ...; starred_at?: string | undefined; }[], 200>>
' has no matching index signature for type 'number
'.
Broken Code ❌
This error occurs because ReturnType<typeof getMaintainers>
is a Promise
, not an array, and indexing it with [number]
is not valid.
Fixed Code ✔️
To fix this, you need to first resolve the Promise
to access the array and then apply the [number]
index signature:
Here, the Awaited
utility type is used to extract the resolved type of the Promise
, which allows us to safely index the result as an array.
TS2538
Type 'Person' cannot be used as an index type.
Broken Code ❌
Fixed Code ✔️
You cannot use an interface as an index type, but you can use all keys of the interface using the keyof
type operator:
TS2539
Cannot assign to
defaultName
because it is not a variable.
Broken Code ❌
Fixed Code ✔️
Using the let keyword might lead to the assumption of exporting a variable, but in reality, every export becomes a constant. As we're aware, constants cannot be reassigned.
To work around this, we can use a little trick with how some types are handled. If we put our defaultName
(initially a primitive string
type) inside an object (which is a complex type), we can change the value inside the object as it is passed by reference:
TS2540
Cannot assign to '
name
' because it is a read-only property.
Broken Code ❌
Fixed Code ✔️
The user
object has been initialized with a const assertion, indicating to the compiler that the object is immutable. If you wish to reintroduce mutability, you have to remove the const assertion:
TS2550
Property '
setPrototypeOf
' does not exist on type 'ObjectConstructor
'. Do you need to change your target library? Try changing the 'lib
' compiler option to 'es2015
' or later.
Broken Code ❌
Fixed Code ✔️
ES5, also known as ECMAScript 2009, doesn't include Object.setPrototypeOf
which is why you have to upgrade to ES6 (also known as ES2015):
TS2551
Property '
title
' does not exist on type 'Video
'. Did you mean 'titles
'?
Broken Code ❌
Fixed Code ✔️
There is a typo in our code which TypeScript's compiler has caught for us. We have to rename the titles
property:
TS2552
Cannot find name 'readonlyArray'. Did you mean 'ReadonlyArray'?
Broken Code ❌
Fixed Code ✔️
TS2554
Expected 2 arguments, but got 1.
Broken Code ❌
Fixed Code ✔️
Video Tutorial
TS2556
A spread argument must either have a tuple type or be passed to a rest parameter.
Broken Code ❌
Fixed Code ✔️
When calling a function using the spread syntax (...
), we have to ensure that the called function uses a rest parameter:
TS2558
Expected 2 type arguments, but got 1.
Broken Code ❌
Fixed Code ✔️
The combine
function defines 2 type variables (X
& Y
), so you have to pass it 2 type arguments:
TS2559
Type '
{ city: string; }
' has no properties in common with type 'User
'.
Broken Code ❌
Fixed Code ✔️
The problem occurs with weak types (in this case User
). All properties of a weak type are optional but when your input doesn't match any of the properties, you will get to see error TS2559. To fix it you have to match at least one of the optional properties:
TS2561
Object literal may only specify known properties, but '
playlistId
' does not exist in type 'VideoWhereInput
'. Did you mean to write 'playlists
'?
Broken Code ❌
Solution:
Correct the property name in the object literal to match the expected property in the 'VideoWhereInput
' type.
Fixed Code ✔️
TS2564
Property 'name' has no initializer and is not definitely assigned in the constructor.
This error can occur with TypeScript 2.7 in "strict" mode. TypeScript 2.7 introduced a new flag called --strictPropertyInitialization
, which tells the compiler to check that each instance property of a class gets initialized in the constructor body, or by a property initializer. See Strict Class Initialization.
Broken Code ❌
Fixed Code ✔️
We have to initialize the name
member either at its definition or within the constructor
.
Solution 1:
Solution 2:
Solution 3:
Video Tutorial
TS2567
Enum declarations can only merge with namespace or other enum declarations.
lib.dom.d.ts(18299, 6)
: 'ResponseType' was also declared here.
Broken Code ❌
Fixed Code ✔️
In the broken code shown above, a type ResponseType
is already declared as part of the "dom" typings. Enums can be merged with other enums but since the other declaration of ResponseType
is a type
, we cannot merge the existing declaration with our custom one. That's why we have to remove "dom" from the "lib" entries in our "tsconfig.json" file or use a different name for our enum
:
TS2571
Object is of type 'unknown'.
Broken Code ❌
If you use third-party libraries then it can happen that TypeScript cannot infer all return types. In such a case a return type can be unknown
which makes it impossible to access its properties from TypeScript. In the following example such case is constructed by assigning unknown
to an exemplary constant:
Fixed Code ✔️
To solve the problem of accessing properties from an unknown object, we have to define the type of the object which we want to access:
Broken Code ❌
Fixed Code ✔️
If your variable is of type unknown
, then you can use a type guard to narrow the type of your variable. If you want to be sure that you have an object at hand, you can use the typeof
type guard:
Alternative
You may also get the error "Object is of type 'unknown'" when catching errors. In this case you have to type the error in your catch clause.
TS2574
A rest element type must be an array type.
Broken Code ❌
Fixed Code ✔️
Simply turn ...number
into ...number[]
:
TS2577
Return type annotation circularly references itself.
Broken Code ❌
Fixed Code ✔️
You can remove the circular reference by removing the explicit return type (OurReply
) from the signature of your function:
TS2580
Cannot find name 'require'. Do you need to install type definitions for node? Try
npm i --save-dev @types/node
.
Broken Code ❌
Fixed Code ✔️
Install typings for Node.js:
Update code to modern import syntax:
TS2582
Cannot find name 'test'. Do you need to install type definitions for a test runner? Try
npm i --save-dev @types/jest
ornpm i --save-dev @types/mocha
.
Broken Code ❌
Fixed Code ✔️
The error above is very specific to your testing framework and when using Jest it can be easily solved by installing definition files for Jest (npm i --save-dev @types/jest
).
When you are using Playwright, then you would have to make sure that you properly import Playwright's definition for test
:
TS2583
Cannot find name 'BigInt'. Do you need to change your target library? Try changing the 'lib' compiler option to 'es2020' or later.
Broken Code ❌
Fixed Code ✔️
Arbitrary-precision integers (BigInt) were introduced in 11th edition of the ECMAScript Language Specification (ES11 / ES2020), so you have to add this information to the "lib" property of your TypeScript configuration to make use of this API:
Alternatively, you can make all additional APIs from ES2020 available to your code:
TS2584
Cannot find name 'console'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'.
Broken Code ❌
TypeScript code:
TypeScript compiler configuration (tsconfig.json
):
Fixed Code ✔️
You have to add the following to your "tsconfig.json" file:
When you are working on an application which never runs in a browser but only in Node.js environments, then you could add @types/node
to your devDependencies
instead of adding "dom"
to your "lib"
section.
TS2588
Cannot assign to 'name' because it is a constant.
Broken Code ❌
Fixed Code ✔️
You cannot reassign values to constants which is why you have to declare a variable using the let
keyword:
TS2589
Type instantiation is excessively deep and possibly infinite.
Broken Code ❌
Solution:
This TypeScript error occurs because the type instantiation for recursive type definitions is too deep for the compiler to handle, leading to an "excessively deep and possibly infinite" error. Recursive type definitions can cause performance issues in the TypeScript compiler, especially when the recursion depth is significant.
To fix this, you can try to simplify the type or reduce the depth of recursion. Here, we'll try to simplify the type definition by reducing the recursion depth and providing an alternative approach that avoids excessive type instantiation.
Solution:
TS2595
'
React
' can only be imported by using a default import.
Broken Code ❌
Fixed Code ✔️
A default import cannot be put in curly braces:
TS2604
Component '
Content
' is not a valid component. If this is a Svelte or Vue component, it might have a syntax error that makes it impossible to parse.
Broken Code ❌
Fixed Code ✔️
When running into issues with Astro Components, make sure that your .astro/types.d.ts
file is recent by running astro build
. Also ensure that the src/env.d.ts
file is loaded correctly to wire up the astro/client
typings.
TS2611
'
name
' is defined as a property in class 'Person
', but is overridden here in 'MyPerson
' as an accessor.
Broken Code ❌
Getters and setters are property accessors, so you have to make sure that you don't mix property definitions with property accessor definitions. Using the accessor
keyword, you can turn a property into a property accessor:
TS2612
Property
myVariable
will overwrite the base property inMyBaseClass
. If this is intentional, add an initializer. Otherwise, add adeclare
modifier or remove the redundant declaration.
Broken Code ❌
Fixed Code ✔️
If you don't intend to reinitialize an inherited variable, you can simply avoid it to be redeclared:
TS2613
Module '
add
' has no default export. Did you mean to use 'import { add } from "add"
' instead?
Broken Code ❌
Fixed Code ✔️
To fix the bug we have to convert our named export into a default export:
TS2614
TS2614: Module
'./add.js'
has no exported memberadd
. Did you mean to useimport add from "./add.js"
instead?
Broken Code ❌
add.ts
main.ts
Fixed Code ✔️
There are multiple ways to fix this. The simplest would be turning your import statement into a default import:
An alternative solution would be using a named export:
You could actually use a named export and a default export in the same file:
TS2616
'React' can only be imported by using 'import React = require("react")' or a default import.
Broken Code ❌
Fixed Code ✔️
Use default import for React:
TS2617
path
can only be imported by usingimport path = require("node:path")
or by turning on theesModuleInterop
flag and using a default import.
Broken Code ❌
Fixed Code ✔️
TS2632
Cannot assign to
path
because it is an import.
Broken Code ❌
Fixed Code ✔️
TS2636
Type '
Func<super-T>
' is not assignable to type 'Func<sub-T>
' as implied by variance annotation. Type 'super-T
' is not assignable to type 'sub-T
'.
Broken Code ❌
Fixed Code ✔️
Variance annotations on type variables must be consistent with their position. If a type variable is at output (read) position, it should be annotated with out
:
Alternatively, you can annotate it with both in
and out
(i.e. as invariant):
TS2637
Variance annotations are only supported in type aliases for object, function, constructor, and mapped types.
Broken Code ❌
Fixed Code ✔️
Variance annotations only make sense if variance is considered while resolving the type alias. Since tuples and arrays are always type-checked covariantly, they do nothing in this case and thus raise the error.
To resolve the error, simply remove the variance annotation.
TS2638
Type
{}
may represent a primitive value, which is not permitted as the right operand of thein
operator.
Broken Code ❌
Fixed Code ✔️
When narrowing down the properties of error
, it is important to first verify that error
is an object and not a primitive value. Only then can we test if error
has a property called status
. If we skip the object check, error
could be a primitive value, making the use of the in
operator incorrect.
TS2652
Merged declaration '
MyPerson
' cannot include a default export declaration. Consider adding a separate 'export default MyPerson
' declaration instead.
Broken Code ❌
Fixed Code ✔️
You cannot use the same name to declare a constant and a function. If your intention is to export your constant, then do the following:
TS2654
Exported external package typings file cannot contain tripleslash references. Please contact the package author to update the package definition.
Broken Code ❌
Fix
- Remove
/// <reference path="..." />
in.d.ts
files
Video Tutorial
TS2656
Exported external package typings file '
../proteus.d.ts
' is not a module. Please contact the package author to update the package definition.
Broken Code ❌
Fixed Code ✔️
TS2661
Cannot export '
getSdk
'. Only local declarations can be exported from a module.
Broken Code ❌
Fixed Code ✔️
If you want to re-export getSdk
in another file, you have to export it first from its origin and then import it in the file where you want to re-export it:
TS2663
Cannot find name '
firstName
'. Did you mean the instance member 'this.firstName
'?
Broken Code ❌
Fixed Code ✔️
If you want to use a getter, you need to back it up with a private property:
Starting from TypeScript 4.9, you can also use an auto-accessor field:
TS2664
Invalid module name in augmentation, module '
gas-local
' cannot be found.
Broken Code ❌
Fixed Code ✔️
The problem occurs when you want to write a module augmentation for a package that isn't found in your "node_modules" directory. Make sure to install the module:
TS2665
Invalid module name in augmentation. Module '
gas-local
' resolves to an untyped module at '../node_modules/gas-local/index.js
', which cannot be augmented.
Broken Code ❌
Fixed Code ✔️
You have to move the shorthand ambient module declaration from a ".ts" file into a ".d.ts" file:
TS2668
'export' modifier cannot be applied to ambient modules and module augmentations since they are always visible.
Info
Ambient modules
To describe the shape of libraries not written in TypeScript, we need to declare the API that the library exposes. We call declarations that don’t define an implementation “ambient”. Typically, these are defined in .d.ts
files. If you’re familiar with C/C++, you can think of these as .h
files.
Source: Modules - Introduction
Module Augmentation
With module augmentation, users have the ability to extend existing modules such that consumers can specify if they want to import the whole module or just a subset.
Source: TypeScript 1.8 Release Notes
Broken Code ❌
Fixed Code ✔️
Usage
TS2669
Augmentations for the global scope can only be directly nested in external modules or ambient module declarations.
Broken Code ❌
You have to turn your code into a module by adding an import
or export
statement to your code. The easiest way to solve the problem is exporting an empty object:
Fixed Code ✔️
How to fix it using a module:
Augmentations for the global scope can only be directly nested in external modules or ambient module declarations.
Broken Code ❌
Fixed Code ✔️
You can create an ambient module by using the declare module
syntax:
TS2674
Constructor of class '
Node<NodeType>
' is protected and only accessible within the class declaration.
Broken Code ❌
This error occurs because the Node
class's constructor is marked as protected
, so it cannot be instantiated directly outside the class.
Fixed Code ✔️
To fix this, either change the constructor
to public
if you want instances to be created directly:
Alternatively, you can add a static factory method within the class to control instance creation while keeping the constructor protected:
TS2677
A type predicate's type must be assignable to its parameter's type. Type '
number
' is not assignable to type 'string
'.
Broken Code ❌
Fixed Code ✔️
The input
is declared to be of type string
which is why the type predicate cannot turn it into a number
because these two declarations are mutually exclusive. That's why we have to declare an input type of any
:
TS2678
Type '
StreamStatus
' is not comparable to type 'number
'.
Broken Code ❌
Fixed Code ✔️
The StreamResponse
declares a "status" property of type number
but the switch-case statement checks against StreamStatus
, so we have to adjust the typing for "status" of StreamResponse
:
TS2680
A 'this' parameter must be the first parameter.
Broken Code ❌
Fixed Code ✔️
TypeScript requires that a this
parameter always comes first in the list of parameters:
TS2683
'this' implicitly has type 'any' because it does not have a type annotation.
Broken Code ❌
Fixed Code ✔️
This bug is also a consequence of TS2680. To fix the bug we have to define the context of our function. It can be done by defining this
as the first parameter in our argument list and giving it a type annotation:
TS2684
The '
this
' context of type 'void
' is not assignable to method's 'this
' of type 'Person
'.
Broken Code ❌
Fixed Code ✔️
When calling a function that defines a this
parameter, then we have to set the this
context with apply
, bind
or call
.
Using apply
:
Using bind
:
Using call
:
Note: The TS2684 error may also occur when attempting to call static
functions of a class
with a private
constructor.
TS2686
'ko' refers to a UMD global, but the current file is a module. Consider adding an import instead.
Broken Code ❌
Fixed Code ✔️
'sinon' refers to a UMD global, but the current file is a module. Consider adding an import instead.
Broken Code ❌
Fixed Code ✔️
'React' refers to a UMD global, but the current file is a module. Consider adding an import instead.
Broken Code ❌
Fixed Code ✔️
Use default import for React:
TS2687
All declarations of 'status' must have identical modifiers.
lib.dom.d.ts(11620, 14)
: 'status
' was also declared here.
Broken Code ❌
Fixed Code ✔️
In the error above, a Response
is declared which should be merged (using declaration merging) with the Response
interface of the "dom" library which is set in "lib" within the "tsconfig.json" file. When merging with an existing declaration, the property types of the first declaration must be matched because you can only add additional properties when using declaration merging. The same rules applies to modifiers. Because "status" has a readonly modifier in the existing Response
interface, we must declare the same in our own interface extension:
TS2688
Cannot find type definition file for '
vitest/globals
'. The file is in the program because: Entry point of type library 'vitest/globals
' specified incompilerOptions
.
Broken Code ❌
Solution:
Ensure the "vitest" type definitions are installed via npm:
Fixed Code ✔️
TS2689
Cannot extend an interface 'Animal'. Did you mean 'implements'?
Broken Code ❌
Fixed Code ✔️
The TypeScript compiler tells us already the solution: When implementing an interface, we have to use implements
. If we inherit from classes, we use extends
.
TS2691
An import path cannot end with a '.d.ts' extension. Consider importing './index' instead.
Broken Code ❌
You cannot directly import code from declaration files:
Fixed Code ✔️
You have to import functions from the source code file (e.g. index.ts
):
TS2693
'
Candlestick
' only refers to a type, but is being used as a value here.
Broken Code ❌
The error happens when an instance or a constructor is expected but you are providing only the type of something. In the case below the ApiOkResponse
decorater expects you to provide a constructor but for the type
property but only a type is being provided.
Fixed Code ✔️
To fix the issue, we can make use of a wrapper object for the number type. It's actually one of the few cases where you would need it:
Broken Code ❌
The error here is that only a type / interface is being exported. Types / interfaces cannot be used with the new
keyword as they are not constructors.
Fixed Code ✔️
To fix the issue we have to export a class which can then be used to constructed an instance:
TS2694
Namespace '
React
' has no exported member 'NonExistent
'.
Broken Code ❌
Fixed Code ✔️
When trying to import a type that is missing in an external namespace, then you have to add the missing typings yourself:
TS2695
Left side of comma operator is unused and has no side effects.
Broken Code ❌
Fixed Code ✔️
You just cannot leave out a callback parameter if you don't want to use it. Mark it with an underscore (_
) instead:
TS2705
An async function or method in ES5/ES3 requires the '
Promise
' constructor. Make sure you have a declaration for the 'Promise
' constructor or include 'ES2015
' in your '--lib
' option.
Solution:
Include the ES2015
library in the --lib
option of your tsconfig.json
:
TS2706
Required type parameters may not follow optional type parameters.
Broken Code ❌
Fixed Code ✔️
The generic type Key
is defined with a default value of string
which makes this type parameter not optional. However, the Value
type parameter is optional and optional parameters are not allowed to follow required parameters.
To solve the situation, we have can switch the position of the two parameters which would impact how we use the code:
Alternatively, we can also set a default type for Value
:
TS2707
Generic type '
Iterator<T, TReturn, TNext>
' requires between 1 and 3 type arguments.
Broken Code ❌
Fixed Code ✔️
You have to at least pass 1 type argument to the generic Iterator
type:
TS2709
Cannot use namespace '
globalThis
' as a type.
Broken Code ❌
Fixed Code ✔️
You cannot use a namespace as a type, but you can get the type assigned with that namespace by using the typeof
operator:
TS2713
Cannot access '
CheckSuite.status
' because 'CheckSuite
' is a type, but not a namespace. Did you mean to retrieve the type of the property 'status
' in 'CheckSuite
' with 'CheckSuite["status"]
'?
Broken Code ❌
Fixed Code ✔️
The utility type Pick
comes in handy when you want to select and extract specific properties from one type and apply them to another type:
TS2715
Abstract property 'name' in class 'Animal' cannot be accessed in the constructor.
Broken Code ❌
Fixed Code ✔️
The name
member of the abstract Animal
class is abstract
, so we have to define it ourselves in the derived class Dog
. Because name
has no access modifier, it is public
by default which means that our Dog
class has to implement it with a public
visibility:
TS2717
Subsequent property declarations must have the same type. Property '
verbose
' must be of type 'boolean
', but here has type 'string
'.
Broken Code ❌
Fixed Code ✔️
When declaring a property (in this case verbose
) twice, then the second declaration must follow the typings of the first declaration:
Usually the error TS2717 shows up when you have multiple versions of typings (i.e. @types/react
) for the same interfaces in your codebase. If you run into these kind of problems, you can inspect your typing resolutions using yarn why
(i.e. yarn why @types/react
) or npm explain
(i.e. npm explain @types/react
) to find out where you have conflicting typings.
Video Tutorial
TS2720
Class '
Dog
' incorrectly implements class 'Animal
'. Did you mean to extend 'Animal
' and inherit its members as a subclass? Property 'makeNoise
' is protected but type 'Dog
' is not a class derived from 'Animal
'.
Broken Code ❌
Fixed Code ✔️
The implements
keyword is reserved to implement interfaces. If you want to work with class inheritance, you have to use extends
:
Video Tutorial
TS2722
Cannot invoke an object which is possibly '
undefined
'.
Broken Code ❌
Fixed Code ✔️
Method invocation only works if the method is defined. The onClick
method of the event
object in the example above is optional, which means it can be undefined
. That's why we have to make an existence check before calling / invoking it:
As of TypeScript 3.7 you can also use the optional chaining (?.
) operator to call a method on an object if it exists:
A third possibility is to use reference validation:
TS2724
'
./index
' has no exported member named 'HeaderOptions
'. Did you mean 'HeaderOption
'?
Broken Code ❌
Fixed Code ✔️
TypeScript noticed a typing error in the name of the imported interface. The code will work if we correct the typo:
TS2730
An arrow function cannot have a 'this' parameter.
Broken Code ❌
Fixed Code ✔️
You have to turn the arrow function expression into to a function declaration:
TS2732
Cannot find module '../../package.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.
Broken Code ❌
Fixed Code ✔️
To fix the issue and allow importing JSON files, you have to set "resolveJsonModule" to true
in your "tsconfig.json" file.
TS2739
Type '
{}
' is missing the following properties from type 'Person
':age
,name
Broken Code ❌
Fixed Code ✔️
The object doesn't have any properties, so it cannot be assigned to the type of Person
. We have to add the missing properties to fix this error:
Video Tutorial
Type 'string[]' is missing the following properties from type 'Promise ': then, catch, [Symbol.toStringTag]
Broken Code ❌
When your function specifies to return a Promise, you have to ensure that your return value is also wrapped in a Promise
:
Alternatively, you can make use of the async
keyword, which will automatically wrap your return value into a Promise
:
TS2740
Type '
TextLine
' is missing the following properties from type 'Position
': line, character, isBefore, isBeforeOrEqual, and 6 more.
Broken Code ❌
Fixed Code ✔️
The parameter startLine
is requiring a value of type Position
but the default value returns a value of type TextLine
, so this has to be fixed to return the expected type:
TS2741
Property 'name' is missing in type '{}' but required in type 'Animal'.
Broken Code ❌
Fixed Code ✔️
Interfaces can be used with classes or plain objects. If we want our object (i.e. laika
) to fulfill the contract of Animal
, we have to assign all required properties to it:
Video Tutorial
TS2742
The inferred type of '
ProductDeleteDocument
' cannot be named without a reference to 'graphql-tag/node_modules/graphql/language/ast
'. This is likely not portable. A type annotation is necessary.
Broken Code ❌
Fixed Code ✔️
TypeScript asks for a type annotation to explicitly resolve the inferred type, so let's add a type annotation:
In a monorepository the error TS2742 can show up when you are using a package that has not set a "main" property in its "package.json" file. Sometimes it also happens that there is a "types" property which does not point to the correct typings. Make sure both paths are present and relative:
You can run into this error when a code generator, such as graphql-code-generator
, misses to render an important statement (see here). This can happen when the generator relies on implicit typings (type inference) and it can be fixed by instructing your code generator to render the missing import statement. Depending on your code generator this could be done through a config file:
With TypeScript 5.5, the compiler has become more lenient towards this error, and many instances of it should disappear (source).
TS2749
'
paramNames
' refers to a value, but is being used as a type here. Did you mean 'typeof paramNames
'?
Broken Code ❌
Fixed Code ✔️
TS2769
No overload matches this call.
Broken Code ❌
Fixed Code ✔️
There are only two function overloads for sum
. The first overload expects a
and b
to be of type number
. The second overload expects a
and b
to be of type string
but there is no overload that specifies a
to be a string
while b
is a number
. We have to add a third overload to allow such function calls:
An even easier solution would be to remove all function overloads as the function body allows us to use number
or string
through the union type of number | string
:
TS2774
This condition will always return true since this function is always defined. Did you mean to call it instead?
Broken Code ❌
Fixed Code ✔️
Both interfaces (MyPerson
& MyDog
) declare a function named age
, so that if
-condition to check for its existence is unnecessary:
TS2779
The left-hand side of an assignment expression may not be an optional property access.
Broken Code ❌
Fixed Code ✔️
You cannot assign a value to a property which might be undefined
. As Map.get() may return undefined
, you have to add an existence check:
TS2786
'
Component
' cannot be used as a JSX component.
Broken Code ❌
Fixed Code ✔️
Usually the problem derives from a mismatch in @types/react
. When you have libraries that are dependent on a specific version of @types/react
(i.e. v17.0.47) and you have other libraries working with another major version of @types/react
(i.e. v18.0.14), then this can cause compatibility issues when using React.ReactNode
or JSX.Element
. You have to streamline your dependencies on @types/react
, so that these follow the same major version.
You can find all libraries depending on @types/react
in your project by executing npm explain @types/react
(when a package-lock.json
file is present) or yarn why @types/react
(when a yarn.lock
file is present).
TS2790
The operand of a 'delete' operator must be optional.
Broken Code ❌
Fixed Code ✔️
When using the delete
operator to remove a property from an object, the property must be defined as optional in TypeScript:
TS2792
Cannot find module '
@playwright/test
'. Did you mean to set the 'moduleResolution
' option to 'node
', or to add aliases to the 'paths
' option?
Broken Code ❌
Fixed Code ✔️
To fix the problem you have to use "moduleResolution": "node"
in your TS config:
TS2794
Expected 1 arguments, but got 0. Did you forget to include '
void
' in your type argument to 'Promise
'?
Broken Code ❌
Fixed Code ✔️
When a Promise resolves with nothing, you need to define that as a type argument to the generic Promise
:
TS2802
Type '
Set<string>
' can only be iterated through when using the '--downlevelIteration
' flag or with a '--target
' of 'es2015
' or higher.
Broken Code ❌
Fixed Code ✔️
In order to resolve the issue, you need to use a higher target environment which supports iterables, such as ES6 for example:
Alternative:
TypeScript will downlevel your code based on your defined "target" to support older JavaScript runtimes that lack built-in iterables. You can enable the downlevelIteration option to ensure compatibility with both legacy and modern platforms. This option generates a helper function that checks if the modern iteration is possible. If it is not supported, the helper function falls back to a legacy iteration, such as index-based iteration.
TS2813
Class declaration cannot implement overload list for 'MyClass'.
Broken Code ❌
Function declarations get hoisted, so you cannot give your class
the name of your function. Renaming your class solves the issue:
Fixed Code ✔️
TS2814
Function with bodies can only merge with classes that are ambient.
Broken Code ❌
Your function
cannot be named after your class
, so you will have to rename your function:
Fixed Code ✔️
Alternatively you can declare an ambient class which gets implemented by your function:
TS2820
Type '
"Topicks"
' is not assignable to type 'keyof SearchResultStackParamList
'. Did you mean '"Topics"
'?
Broken Code ❌
Solution:
Correct the screen name ("Topicks") to match the expected type in SearchResultStackParamList
.
Fixed Code ✔️
TS2821
Import assertions are only supported when the
--module
option is set toesnext
ornodenext
.
Broken Code ❌
Fixed Code ✔️
Make sure that "module" in your tsconfig.json
is set to esnext
or nodenext
before using an import assertion.
TS2823
Import attributes are only supported when the '
--module
' option is set to 'esnext
', 'nodenext
', or 'preserve
'.
Broken Code ❌
Solution:
Update your tsconfig.json
file to set the --module
option to esnext
.
Fixed Code ✔️
This change enables support for import attributes.
TS2834
Relative import paths need explicit file extensions in EcmaScript imports when '
--moduleResolution
' is 'node16
' or 'nodenext
'. Consider adding an extension to the import path.
Broken Code ❌
Solution:
This error occurs because, with moduleResolution
set to node16
or nodenext
, TypeScript requires explicit file extensions in import paths for ECMAScript modules to ensure compatibility with Node.js's resolution mechanism. Add the explicit file extension to fix the import path.
Fixed Code ✔️
TS2835
Relative import paths need explicit file extensions in EcmaScript imports when '
--moduleResolution
' is 'node16
' or 'nodenext
'. Did you mean './RESTClient.js
'?
Broken Code ❌
Fixed Code ✔️
When using "moduleResolution": "node16"
in your tsconfig.json
, you have to add .js
file extensions or /index.js
suffixes in your import statements or dynamic import()
calls.
TS2845
This condition will always return '
false
'.
Broken Code ❌
This error occurs because comparing a value directly to NaN
using ===
will always return false
. In JavaScript and TypeScript, NaN
is not equal to itself.
Fixed Code ✔️
To check if a value is NaN
, use Number.isNaN()
instead:
The Number.isNaN()
method properly checks if the input is NaN
, avoiding the issue with direct equality comparison.
TS2855
Class field
position
defined by the parent class is not accessible in the child class via super.
Broken Code ❌
Solution:
This TypeScript error occurs because while super
can be used to call parent class methods, it cannot be directly used to access parent class fields. Use this
to access the position
property inherited from the parent class, rather than using super
, which is intended for method invocation.
Fixed Code ✔️
TS4010
Type parameter '
T
' of public static method from exported class has or is using private name 'StrategyState
'.
Broken Code ❌
Fixed Code ✔️
When using a type from another file, you have to make sure that it is exported and imported accordingly:
TS4020
'extends' clause of exported class '
StrategyPOJO
' has or is using private name 'Model
'.
Broken Code ❌
Fixed Code ✔️
TS4023
Exported variable '
moduleA
' has or is using name 'ClassA
' from external module 'ClassA
' but cannot be named.
Broken Code ❌
Solution:
The error occurs because the exported variable moduleA
references ClassA
indirectly through moduleB
, and TypeScript needs to be able to name ClassA
for type-checking purposes. Since ClassA
is being exported as a default export, TypeScript cannot directly reference it without importing it.
To fix this, you need to explicitly import and export the ClassA
type in your ModuleA.ts
file. This ensures TypeScript can reference the ClassA
type properly.
Fixed Code ✔️
TS4025
Exported variable '
App
' has or is using private name 'FC
'.
Broken Code ❌
Fixed Code ✔️
When using an external type (like FC
) you also have to make sure that it is imported:
TS4031
Public property '
socket
' of exported class has or is using private name 'ReconnectingWebSocket
'.
Broken Code ❌
Fixed Code ✔️
Employ the typeof
keyword to use the type of your import:
TS4055
Return type of public method from exported class has or is using private name
PortfolioOpenPositionSchema
.
Broken Code ❌
Solution:
Change the method's return type to use the exported type PortfolioOpenPosition
instead of the non-exported schema object.
Fixed Code ✔️
TS4060
Return type of exported function has or is using private name 'JSX'.
Broken Code ❌
Fixed Code ✔️
The global JSX namespace is declared in @types/react
. You have to install the @types/react
package to make use of it:
TS4063
Parameter '
config
' of constructor from exported class has or is using private name 'DoubleMovingAverageConfig
'.
Broken Code ❌
Fixed Code ✔️
TS4075
Parameter 'event' of method from exported interface has or is using private name 'Strategy'.
Broken Code ❌
Fixed Code ✔️
TS4081
Exported type alias '
MyReturnType
' has or is using private name 'getSdk
'.
Broken Code ❌
Fixed Code ✔️
The getSdk
is identified to be private because it is not exported. If we export the getSdk
function, we won't have any more problems:
TS4104
The type '
readonly [1, 2, 3]
' is 'readonly' and cannot be assigned to the mutable type '[1, 2, 3]
'.
Broken Code ❌
Fixed Code ✔️
Using a const assertion makes your array immutable, so you have to use the readonly
modifier for its type:
Alternative:
Alternative #2:
TS4111
Property '
BUCKET
' comes from an index signature, so it must be accessed with['BUCKET']
.
Broken Code ❌
Solution:
To resolve this, ensure that you access properties defined by an index signature using the bracket notation.
Fixed Code ✔️
TS4112
This member cannot have an 'override' modifier because its containing class does not extend another class.
Broken Code ❌
Fixed Code ✔️
TS4113
This member cannot have an '
override
' modifier because it is not declared in the base class 'MyBaseClass
'.
Broken Code ❌
Fixed Code ✔️
You can only override functions in our derived class when those exist in our base class. We can solve the error by overwriting an existing function:
Depending on our use case, we can also remove the override
modifier:
TS4114
This member must have an '
override
' modifier because it overrides a member in the base class 'MyBaseClass
'.
Broken Code ❌
Fixed Code ✔️
The error pops up when "noImplicitOverride" is set to true
in your "tsconfig.json" file, and you don't use the override
modifier when overwriting a function from your base class. You can fix this by setting "noImplicitOverride" to false
(not recommended) or using the override
modifier (preferred solution):
TS5023
Unknown compiler option '
-c
'.
Broken Code ❌
Fixed Code ✔️
If you want to point the TypeScript compiler to a different configuration, you have to use the --project
flag (see all tsc CLI options):
TS5024
Compiler option 'lib' requires a value of type string.
Broken Code ❌
Fixed Code ✔️
You have to define a valid set of high level libraries (such as "es6") that are available in your runtime:
TS5025
Unknown compiler option '--no-emit'. Did you mean 'noEmit'?
Broken Code ❌
Fixed Code ✔️
Use camel case writing:
TS5042
Option 'project' cannot be mixed with source files on a command line.
Broken Code ❌
Fixed Code ✔️
If you're using the -p
/ --project
option, it's not possible to directly pass a source file as an argument to the TypeScript compiler. If you want to specify the files to be compiled while using the project option from the command line interface (CLI), you need to add the desired files to the include
section of your TypeScript project configuration:
TS5054
A 'tsconfig.json' file is already defined at: '
C:/dev/bennycode/ts-node-starter/tsconfig.json
'.
Broken Code ❌
Fixed Code ✔️
You cannot initialize a new TypeScript compiler configuration when there is one already present. You have to delete the existing file first.
TS5055
Cannot write file because it would overwrite input file. Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files.
Broken Code ❌
Fixed Code ✔️
Alternatively, you can also skip compiling code (if you just want to check the types of your code):
TS5058
The specified path does not exist: 'test.json'.
Broken Code ❌
Fixed Code ✔️
You probably don't have a TS config named test.json
. Try to load tsconfig.json
:
TS5069
Option 'declarationMap' cannot be specified without specifying option 'declaration' or option 'composite'.
Broken Code ❌
Fixed Code ✔️
You have to activate the "declaration" property before you can activate "declarationMap":
TS5070
Option '--resolveJsonModule' cannot be specified without 'node' module resolution strategy.
Broken Code ❌
Fixed Code ✔️
Just define the "moduleResolution" property and set it to "node":
TS5083
Cannot read file '
base.json
'.
Broken Code ❌
Fixed Code ✔️
Your TS config is extending another config (called base.json
) which cannot be found. Make sure that this file (base.json
) exists or remove your extends
property.
TS5087
A labeled tuple element is declared as rest with a '
...
' before the name, rather than before the type.
Broken Code ❌
Fixed Code ✔️
We have to move the rest operator to the label name:
TS5093
Compiler option '
--verbose
' may only be used with '--build
'.
Broken Code ❌
Attempting to use --verbose
without --build
:
Solution:
Use the --verbose
option together with the --build
option, which is used for incremental builds.
Fixed Code ✔️
TS5095
Option '
bundler
' can only be used when 'module
' is set to 'preserve
' or to 'es2015
' or later.
Broken Code ❌
Solution:
Change the module
option to es2015
or later, or to preserve
to use the bundler
option.
Fixed Code ✔️
TS5097
An import path can only end with a
.ts
extension whenallowImportingTsExtensions
is enabled.
Broken Code ❌
Solution:
Enable allowImportingTsExtensions
in your tsconfig.json
file.
Fixed Code ✔️
TS5101
Option 'importsNotUsedAsValues' is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption '"ignoreDeprecations": "5.0"' to silence this error. Use 'verbatimModuleSyntax' instead.
Fixed Code ✔️
The compiler option importsNotUsedAsValues is not recommended when using TypeScript 5 and above, so you have to remove it from your tsconfig.json file:
TS5110
Option '
module
' must be set to 'Node16
' when option 'moduleResolution
' is set to 'Node16
'.
Broken Code ❌
Solution:
Set the module
option to Node16
to match the moduleResolution
setting in your tsconfig.json
.
Fixed Code ✔️
TS6053
File '
/typings/index.d.ts
' not found.
Broken Code ❌
Fixed Code ✔️
Use relative paths when using Triple-Slash Directives:
Read more: 8 Steps to Migrating from JavaScript to TypeScript
TS6059
File '
server/package.json
' is not under 'rootDir' 'server/src
'. 'rootDir' is expected to contain all source files.
Broken Code ❌
Fixed Code ✔️
When using require
then we can access files outside the specified root folder for input files ("rootDir" in "tsconfig.json"):
An even better solution would be changing the "rootDir" in your "tsconfig.json", so that it includes the "package.json" file that you are trying to important. This may require you to also set "allowJs" to true
in your "tsconfig.json".
TS6133
'
c
' is declared but its value is never read.
Broken Code ❌
Fixed Code ✔️
The best way to fix it is prefixing the unused parameter with an underscore (_
) as shown below or completely removing it:
'
volume
' is declared but its value is never read.
Broken Code ❌
Fixed Code ✔️
A workaround is to loosen the compiler config (not recommended, though):
'
b
' is declared but its value is never read.
Broken Code ❌
Fixed Code ✔️
You can remove the unused variable from your code or disable the check for unused variables in your TypeScript compiler config:
Video Tutorial
TS6138
Property '
lastName
' is declared but its value is never read.
Broken Code ❌
Fixed Code ✔️
Simply make use of the lastName
property:
TS6192
All imports in import declaration are unused.
Broken Code ❌
Fixed Code ✔️
When multiple imports from a package are not being used, you will receive error TS6192. You can easily fix it by removing the unused import statement:
TS6196
'
MyAbstractClass
' is declared but never used.
Broken Code ❌
Fixed Code ✔️
You have three possibilities to fix the broken code:
- Make use of
MyAbstractClass
in your application - Export
MyAbstractClass
- Set "noUnusedLocals" to
false
in your "tsconfig.json"
TS6198
All destructured elements are unused.
Broken Code ❌
Fixed Code ✔️
You have to make use of the destructured values in your application / code:
TS6234
TS6234: This expression is not callable because it is a
get
accessor. Did you mean to use it without '()
'?
Broken Code ❌
Solution:
To correct this, remove the parentheses from isLong
, allowing it to be accessed as a property.
Fixed Code ✔️
TS6385
'parent' is deprecated.
Broken Code ❌
Solution:
Use import.meta
for checking module parents in modern JavaScript environments.
Fixed Code ✔️
TS6387
The signature
(from: number, length?: number | undefined): string
oferror.substr
is deprecated.
Broken Code ❌
Fixed Code ✔️
Use the slice
method instead of substr
, but be careful about the supplied parameters as the signature is slightly different:
TS6504
File '
mycode.js
' is a JavaScript file. Did you mean to enable the 'allowJs
' option?
Broken Code ❌
Fixed Code ✔️
You have to enable the "allowJS" flag in your "tsconfig.json" file:
Alternatively, you can enable it through the TypeScript Compiler CLI:
TS7005
Variable '
HistoryOrderDataPageSchema
' implicitly has an 'any
' type.
Broken Code ❌
Solution:
Define the type parameter T
correctly by making HistoryOrderDataPageSchema
a function or using a generic type annotation:
Fixed Code ✔️
TS7006
Parameter '
person
' implicitly has an 'any
' type.
Broken Code ❌
Fixed Code ✔️
You have to define the type for the argument named person
:
Alternative, but not recommend:
- Set "noImplicitAny" to
false
in your "tsconfig.json"
TS7008
Member '
name
' implicitly has an 'any' type.
Broken Code ❌
Fixed Code ✔️
To fix the problem, you can initialize the class member so that TypeScript can infer the type:
Alternatively, you can annotate the type:
TS7009
'new' expression, whose target lacks a construct signature, implicitly has an 'any' type.
Broken Code ❌
Fixed Code ✔️
The resolve
function of a Promise
is not a constructor. You can use the new
keyword only with constructors, so the new
keyword has to be removed in order to fix the code:
Alternatively, you can make use of the constructor:
TS7010
'
sum
', which lacks return-type annotation, implicitly has an 'any
' return type.
Broken Code ❌
Fixed Code ✔️
You have to add a return-type annotation and preferably a function implementation:
TS7016
Could not find a declaration file for module '
uuidjs
'.
Broken Code ❌
Fixed Code ✔️
Solution 1
The problem shows that uuidjs
is a plain JavaScript module and doesn't ship with TypeScript declaration files (.d.ts
). That's why we have to use the CommonJS import syntax to import this module in a Node.js environment:
Solution 2
A proper fix would be to have a uuidjs.d.ts
as part of uuidjs
(see GitHub issue).
Example:
Solution 3
If external typings are available in the DefinitelyTyped repository, then you can also install external declarations from there:
Solution 4
If there are no declarations available and you want to use the module (in this case uuidjs
) with standard import syntax (not CommonJS), then you can create a shorthand ambient module declaration by creating a "*.d.ts" file and writing the following into it:
Video Tutorial
TS7017
Element implicitly has an '
any
' type because type '{}
' has no index signature.
Broken Code ❌
Fixed Code ✔️
You have to define the type for indexing your object properties (object["index"]
):
The name of the index can be freely chosen:
How to fix such errors in interfaces:
Alternative, but not recommend:
- Set "noImplicitAny" to
false
in your "tsconfig.json"
Element implicitly has an '
any
' type because type 'typeof globalThis
' has no index signature.
Broken Code ❌
Fixed Code ✔️
Source: globalThis property access errors
Video Tutorial
TS7022
'
window
' implicitly has type 'any
' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
Broken Code ❌
Fixed Code ✔️
The above error can occur when TypeScript doesn't know about the window interface. Make sure to add "dom" to your list of known runtime libraries in your compiler options:
TS7023
'
fibonacci
' implicitly has return type 'any
' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions.
Broken Code ❌
Fixed Code ✔️
To avoid the implicit typing of any
for the return type, you have to add a return type annotation:
TS7026
JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.
Broken Code ❌
Fixed Code ✔️
The global JSX namespace is declared in @types/react
. You have to install the @types/react
package to make use of it:
TS7027
Unreachable code detected.
Broken Code ❌
Fixed Code ✔️
Your code cannot print text to the standard output when your program is told to exit beforehand, so you have to remove the call to exit or place it at a later point in time:
TS7029
Fallthrough case in switch.
Broken Code ❌
Solution:
To address the fallthrough warning in a TypeScript switch statement, you can explicitly use the break
statement.
Fixed Code ✔️
TS7030
Not all code paths return a value.
Broken Code ❌
Fixed Code ✔️
TypeScript reminds us that we forgot to return a value in case our if-condition doesn't match. We can solve this problem in many ways.
Always return a value:
Add general else
:
Handle all cases
:
Add default
case:
Define that the return type can be void
:
Video Tutorial
TS7031
Binding element 'age' implicitly has an 'any' type.
Broken Code ❌
Fixed Code ✔️
TypeScript complains because it doesn't know the type of the argument that we are destructuring. That's why it sets all its properties to the type of any
. To prevent that we have to define a type for the parameter of the printAge
function:
TS7034
Variable '
expectations
' implicitly has type 'any[]
' in some locations where its type cannot be determined.
Broken Code ❌
Fixed Code ✔️
An array can collect values of different types, so we have to tell TypeScript which types we want to collect:
If we want to specify multiple types, we have to define a union type:
Alternative #1:
Create a type alias and provide a type annotation for the expectations
constant:
Alternative #2:
Use concrete values to initialize the expectations
array, so TypeScript can infer the array type for you:
Unrecommended solution:
- Set "noImplicitAny" to
false
in your "tsconfig.json"
TS7038
A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead.
Broken Code ❌
Solution:
Change the import statement to use default import syntax to properly use the 'supertest
' module.
Fixed Code ✔️
TS7041
The containing arrow function captures the global value of '
this
'.
Broken Code ❌
Fixed Code ✔️
Using this
is not allowed in arrow functions (source) because arrow functions aren't made to work with call
, apply
and/or bind
methods (source). We have to replace our arrow function with an anonymous function declaration to prevent that our this
context gets captured:
Since ECMAScript 2015 (ES6) this can be shortened (Object Literal Property Value Shorthand) to:
TS7044
Parameter '
a
' implicitly has an 'any
' type, but a better type may be inferred from usage.
Broken Code ❌
Fixed Code ✔️
From the body of the arrow function expression, TypeScript can see by the *
that a
and b
may be of type number
:
TS7053
Element implicitly has an '
any
' type because expression of type 'string
' can't be used to index type 'Person
'. No index signature with a parameter of type 'string
' was found on type 'Person
'.
Broken Code ❌
The problem with the code listed above is that the parameter key
can be any string
but the Person
interface only allows keys that relate to the properties of the Person
interface (such as name
).
Solution 1 ✔️
You can define an index signature for the Person
interface which will allow all strings:
However, this is not recommend as it will allow you to access keys that are not defined (like age
):
Solution 2 ✔️
The better solution is using the keyof
type operator which creates a literal string union for the possible keys of Person
:
Solution 3 ✔️
You can also use type narrowing, to ensure that the key
parameter is set to a string literal that is supported by the Person
interface:
Solution 4 ✔️
It is overly complex for this example, but another approach is to create an assertion function that ensures the key
corresponds to a specific string literal that matches the Person
interface:
Solution 5 ✔️
Also overengineered, but you could solve the problem with a custom type guard:
TS8020
JSDoc types can only be used inside documentation comments.
Broken Code ❌
Fixed Code ✔️
If you wanted to make c
optional:
If you wanted to document c
with JSDoc:
TS17000
JSX attributes must only be assigned a non-empty 'expression'.
Broken Code ❌
Fixed Code ✔️
You can't use an empty expression ({}
) in JSX attributes:
TS17004
Cannot use JSX unless the '--jsx' flag is provided.
Broken Code ❌
Fixed Code ✔️
You have to add a configuration for "jsx" to your "tsconfig.json" file:
TS17009
'super' must be called before accessing 'this' in the constructor of a derived class.
Broken Code ❌
Fixed Code ✔️
TS17019
'
?
' at the end of a type is not valid TypeScript syntax. Did you mean to write 'URLSearchParams | undefined
'?
Broken Code ❌
Solution:
Correct the parameter type declaration by using | undefined
for optional parameters.
Fixed Code ✔️
TS18003
No inputs were found in config file '
C:/dev/typescripttv/tsconfigs/packages/tsconfig-common/tsconfig.json
'. Specified 'include
' paths were '["**/*"]
' and 'exclude
' paths were '["coverage","dist","node_modules"]
'.
Solution:
Ensure that the include
paths in your tsconfig.json
correctly point to the TypeScript files you want to compile. Verify that the files exist in the specified directories and are not excluded by the exclude
settings.
Fixed Code ✔️
TS18004
No value exists in scope for the shorthand property '
age
'. Either declare one or provide an initializer.
Broken Code ❌
Fixed Code ✔️
If you want to use the shorthand property name syntax to access the age
property, you have to make sure that this variable is defined in the first place:
Alternatively, you can avoid using the shorthand property name syntax:
TS18016
Private identifiers are not allowed outside class bodies.
Broken Code ❌
Fixed Code ✔️
Private properties can only be used in classes but not in interfaces. We therefore need to convert the interface into a class in order to be able to compile the code:
TS18026
'#!' can only be used at the start of a file.
Broken Code ❌
This error occurs because the #!
(shebang) syntax, used to indicate that a file is an executable script, must appear at the very beginning of the file.
Fixed Code ✔️
To fix this, place the #!
shebang at the top of the file before any other code:
TS18028
Private identifiers are only available when targeting ECMAScript 2015 and higher.
Broken Code ❌
Solution:
This TypeScript error occurs because private identifiers (#
) are a feature introduced in ECMAScript 2015 (ES6) and later. To use private identifiers, you need to ensure that your TypeScript configuration targets at least ES6.
Fixed Code ✔️
TS18046
'
error
' is of type 'unknown
'.
Broken Code ❌
Fixed Code ✔️
If you set the useUnknownInCatchVariables
option to true
in your tsconfig.json
file, you may encounter the TS18046 error.
Enabling the useUnknownInCatchVariables feature causes the error within a catch clause to be treated as the unknown
type instead of any
. As a result, you will need to incorporate a type guard or an assertion function to access properties on an object of type unknown
:
TS18047
'user' is possibly 'null'.
Broken Code ❌
Solution:
This TypeScript error occurs because typeof user === "object"
does not exclude the possibility of user
being null
, which is also considered an object in TypeScript/JavaScript.
Add an additional check to ensure that user
is not null
before accessing its properties.
Fixed Code ✔️
TS18048
'
text
' is possibly 'undefined
'.
Broken Code ❌
Fixed Code ✔️
If the text
parameter is optional, it can potentially be of type unknown
. When the type is unknown
, accessing methods like Array.slice is not possible.
To solve this error, we need to employ a type guard to ensure that text
is of type string
:
Note: We also need to employ a default return value to maintain the function return type of string
.
TS18049
'
match
' is possibly 'null
' or 'undefined
'.
Broken Code ❌
This error occurs because match
can return null
if no match is found, and accessing match[1]
would result in a runtime error if null
.
Fixed Code ✔️
You can fix this by safely checking if match
is not null
before trying to access its values:
TS18052
Non-abstract class
MyExtendedClass
does not implement all abstract members of `MyBaseClass.
Broken Code ❌
Fixed Code ✔️
You have to implement all abstract members of MyBaseClass
:
TS71002
"fontSans" is not a valid Next.js entry export value.
Broken Code ❌
Fixed Code ✔️
If you don't need the constant in another file, simply remove it's export
statement:
TS80001
File is a CommonJS module; it may be converted to an ES module.
Broken Code ❌
Solution:
Changing require
to import
updates the module syntax to ES modules, which are more compatible with modern JavaScript environments and tooling.
Fixed Code ✔️
TS80005
'require' call may be converted to an import.