TypeScript is JavaScript with syntax for types.
🐊Putout plugin adds ability to transform TypeScript code. Enabled by default for ts and tsx files.
npm i putout @putout/plugin-typescript -D
- ✅ apply-as-type-assertion;
- ✅ apply-type-guards;
- ✅ apply-utility-types;
- ✅ convert-commonjs-to-esm;
- ✅ convert-esm-to-commonjs;
- ✅ convert-generic-to-shorthand;
- ✅ convert-namespace-to-global;
- ✅ cts-file;
- ✅ find-file;
- ✅ mts-file;
- ✅ remove-duplicate-exports;
- ✅ remove-duplicate-interface-keys;
- ✅ remove-duplicates-from-union;
- ✅ remove-unused-types;
- ✅ remove-getter-arguments;
- ✅ remove-setter-return-type;
- ✅ remove-useless-mapped-types;
- ✅ remove-useless-mapping-modifiers;
- ✅ remove-useless-non-null-expressions;
- ✅ remove-useless-parens;
- ✅ remove-useless-promise;
- ✅ remove-useless-types;
- ✅ remove-useless-types-from-constants;
- ✅ rename-file-cts-to-ts;
- ✅ rename-file-mts-to-ts;
{
"rules": {
"typescript/apply-as-type-assertion": "on",
"typescript/apply-utility-types": "on",
"typescript/apply-type-guards": "on",
"typescript/convert-generic-to-shorthand": "on",
"typescript/convert-commonjs-to-esm": "off",
"typescript/convert-esm-to-commonjs": "off",
"typescript/convert-namespace-to-global": "off",
"typescript/remove-duplicates-from-union": "on",
"typescript/remove-duplicates-interface-keys": "on",
"typescript/remove-duplicates-exports": "on",
"typescript/remove-useless-types-from-constants": "on",
"typescript/remove-unused-types": "on",
"typescript/remove-useless-types": "on",
"typescript/remove-useless-parens": "on",
"typescript/remove-useless-promise": "on",
"typescript/remove-getter-arguments": "on",
"typescript/remove-setter-return-type": "on",
"typescript/remove-useless-mapped-types": "on",
"typescript/remove-useless-non-null-expressions": "on",
"typescript/cts-file": "off",
"typescript/mts-file": "off",
"typescript/rename-file-cts-to-ts": "off",
"typescript/rename-file-mts-to-ts": "off",
"typescript/find-file": ["off", {
"ignore": []
}]
}
}According to best practice.
const boundaryElement = <HTMLElement>e.target;const boundaryElement1 = e.target as HTMLElement;type SuperType1 = {
[Key in keyof Type]?: Type[Key];
};type SuperType1 = Partial<Type>;It just so happens that TypeScript has something called a
type guard. Atype guardis some expression that performs a runtime check that guarantees the type in some scope.(c) typescript.org
Check out in 🐊Putout Editor.
const isNumber = (a) => typeof a === 'number';const isNumber = (a): a is number => typeof a === 'number';There is no difference at all.
Type[]is the shorthand syntax for anarrayofType.Array<Type>is the generic syntax. They are completely equivalent.
Convert generic to shorthand.
interface A {
x: Array<X>;
y: Array<X | Y>;
}interface A {
x: X[];
y: X[] | Y[];
}| Linter | Rule | Fix |
|---|---|---|
| 🐊 Putout | typescript/convert-generic-to-shorthand |
✅ |
| ⏣ ESLint | @typescript-eslint/array-type |
✅ |
Checkout in 🐊Putout Editor.
import foo = require('foo');
export = 5;import foo from 'foo';
export default 5;Checkout in 🐊Putout Editor.
import foo from 'foo';
export default 5;import foo = require('foo');
export = 5;Checkout in 🐊Putout Editor.
declare namespace global {
var al: any;
}declare global {
var al: any;
}| Linter | Rule | Fix |
|---|---|---|
| 🐊 Putout | typescript/convert-namespace-to-global |
✅ |
| ⏣ ESLint | @typescript-eslint/no-namespace |
❌ |
type x =
| boolean[]
| A
| string
| A
| string[]
| boolean[];type x =
| boolean[]
| A
| string
| string[];In JavaScript duplicate exports leads to SyntaxError, anyways TypeScript parses such code and reports Duplicates Identifier diagnostic.
It gives us ability to automate fixing of such code 😏. Check it out in 🐊Putout Editor.
export {
a,
hello,
a,
world,
};export {
hello,
a,
world,
};☝️ The rule fits good with putout/add-newlines-between-specifiers of eslint-plugin-putout.
The
getsyntax binds an object property to a function that will be called when that property is looked up(c) MDN
export interface IParamsConstructor {
get [fromArray](name: string): IParams;
}export interface IParamsConstructor {
get [fromArray](): IParams;
}The
setsyntax binds an object property to a function to be called when there is an attempt to set that property.(c) MDN
export interface IParamsConstructor {
set fromArray(values: ParamsArray): string;
}export interface IParamsConstructor {
set fromArray(values: ParamsArray);
}const x: any = 5;const x = 5;type n = number;
type s = string;
const x: n = 5;type n = number;
const x: n = 5;type oldType = {
a: number;
b: string;
};
type newType = oldType;
const x: newType = {
a: 5,
b: 'hello',
};type oldType = {
a: number;
b: string;
};
const x: oldType = {
a: 5,
b: 'hello',
};Check it out in 🐊Putout Editor.
const m: X[] = [];
const z: X | Y = 5;
const f: X = 5;const x: X[] | Y[] = [];
const m: X[] = [];
const z: X | Y = 5;
const f: X = 5;Check it out in 🐊Putout Editor.
function doStuff(): Promise<string> {
return 'hello';
}function doStuff(): string {
return 'hello';
}Remove useless mapped types.
type SuperType = {
[Key in keyof Type]: Type[Key];
};type SuperType = Type;Checkout in 🐊Putout Editor.
const bar = foo!!.str;
const baz = bar!?.n;const bar = foo!.str;
const baz = bar?.n;Remove useless mapping modifiers.
type SuperType = {
[Key in keyof Type]+?: Type[Key];
};type SuperType = {
[Key in keyof Type]?: Type[Key];
};interface Hello {
hello: any;
hello: string;
}interface Hello {
hello: string;
}Run convert-esm-to-commonjs for all *.cts files with help of redlint.
Check out in 🐊Putout Editor.
Run convert-esm-to-commonjs for all *.mts files with help of redlint.
Check out in 🐊Putout Editor.
Checkout in 🐊Putout Editor.
__putout_processor_filesystem(['/', [
'/hello.ts',
'const a: number = 5;',
]]);__putout_processor_filesystem([
'/',
['/hello.ts', 'const a = 5;'],
]);Rename *.cts files when type === "commonjs":
/
|-- package.json
`-- lib/
- `-- hello.cts
+ `-- hello.tsCheck out in 🐊Putout Editor.
Rename *.mts files when type === "module":
/
|-- package.json
`-- lib/
- `-- hello.mts
+ `-- hello.tsCheck out in 🐊Putout Editor.
MIT