Last updated
Example: Object and Interface Generation
// JavaScript:
function createUser(name, email, age) {
return {
id: Math.random().toString(36),
name,
email,
age,
createdAt: new Date()
};
}
function getUserDisplayName(user) {
return `${user.name} <${user.email}>`;
}
// TypeScript (converted):
interface User {
id: string;
name: string;
email: string;
age: number;
createdAt: Date;
}
function createUser(name: string, email: string, age: number): User {
return {
id: Math.random().toString(36),
name,
email,
age,
createdAt: new Date()
};
}
function getUserDisplayName(user: User): string {
return `${user.name} <${user.email}>`;
}
Example: Class Conversion
// JavaScript:
class EventEmitter {
constructor() {
this.events = {};
}
on(event, listener) {
if (!this.events[event]) this.events[event] = [];
this.events[event].push(listener);
return this;
}
emit(event, ...args) {
if (this.events[event]) {
this.events[event].forEach(l => l(...args));
}
}
off(event, listener) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(l => l !== listener);
}
}
}
// TypeScript (converted):
type Listener = (...args: unknown[]) => void;
class EventEmitter {
private events: Record<string, Listener[]>;
constructor() {
this.events = {};
}
on(event: string, listener: Listener): this {
if (!this.events[event]) this.events[event] = [];
this.events[event].push(listener);
return this;
}
emit(event: string, ...args: unknown[]): void {
if (this.events[event]) {
this.events[event].forEach(l => l(...args));
}
}
off(event: string, listener: Listener): void {
if (this.events[event]) {
this.events[event] = this.events[event].filter(l => l !== listener);
}
}
}
Example: Async Function Conversion
// JavaScript:
async function fetchUser(id) {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return response.json();
}
async function fetchUserPosts(userId) {
const [user, posts] = await Promise.all([
fetchUser(userId),
fetch(`/api/users/${userId}/posts`).then(r => r.json())
]);
return { user, posts };
}
// TypeScript (converted):
interface User {
id: number;
name: string;
email: string;
}
interface Post {
id: number;
title: string;
body: string;
userId: number;
}
interface UserWithPosts {
user: User;
posts: Post[];
}
async function fetchUser(id: number): Promise<User> {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return response.json() as Promise<User>;
}
async function fetchUserPosts(userId: number): Promise<UserWithPosts> {
const [user, posts] = await Promise.all([
fetchUser(userId),
fetch(`/api/users/${userId}/posts`).then(r => r.json() as Promise<Post[]>)
]);
return { user, posts };
}
Example: Generic Function Conversion
// JavaScript:
function first(arr) {
return arr[0];
}
function last(arr) {
return arr[arr.length - 1];
}
function findById(items, id) {
return items.find(item => item.id === id);
}
// TypeScript (converted with generics):
function first<T>(arr: T[]): T | undefined {
return arr[0];
}
function last<T>(arr: T[]): T | undefined {
return arr[arr.length - 1];
}
function findById<T extends { id: unknown }>(items: T[], id: T['id']): T | undefined {
return items.find(item => item.id === id);
}
Example: React Component Conversion
// JavaScript:
function UserCard({ user, onEdit, onDelete, showActions = true }) {
return (
<div className="user-card">
<h3>{user.name}</h3>
<p>{user.email}</p>
{showActions && (
<div>
<button onClick={() => onEdit(user.id)}>Edit</button>
<button onClick={() => onDelete(user.id)}>Delete</button>
)}
</div>
);
}
// TypeScript (converted):
interface User {
id: number;
name: string;
email: string;
}
interface UserCardProps {
user: User;
onEdit: (id: number) => void;
onDelete: (id: number) => void;
showActions?: boolean;
}
const UserCard: React.FC<UserCardProps> = ({
user,
onEdit,
onDelete,
showActions = true
}) => {
return (
<div className="user-card">
<h3>{user.name}</h3>
<p>{user.email}</p>
{showActions && (
<div>
<button onClick={() => onEdit(user.id)}>Edit</button>
<button onClick={() => onDelete(user.id)}>Delete</button>
</div>
)}
</div>
);
};
Example: Type Errors Surfaced During Conversion
// JavaScript (no errors visible):
function processItems(items) {
return items.map(item => item.value.toUpperCase());
}
processItems([{ value: 'hello' }, { value: null }]);
// Runtime error: Cannot read property 'toUpperCase' of null
// TypeScript (error caught at compile time):
interface Item {
value: string | null;
}
function processItems(items: Item[]): string[] {
return items.map(item => item.value.toUpperCase());
// TS Error: Object is possibly 'null'. (line 2)
}
// Fixed TypeScript:
function processItems(items: Item[]): string[] {
return items
.filter((item): item is { value: string } => item.value !== null)
.map(item => item.value.toUpperCase());
}
Migration Strategy
- Step 1: Rename .js files to .ts (or .jsx to .tsx for React)
- Step 2: Add "strict": false to tsconfig.json initially
- Step 3: Use the converter to add basic type annotations
- Step 4: Fix any type errors the compiler reports
- Step 5: Gradually enable stricter TypeScript options
- Step 6: Replace any types with specific types over time
Paste your JavaScript code to get a TypeScript version with inferred types, generated interfaces, and access modifier suggestions. The output is a starting point — review and refine the types for your specific use case.
Example: Basic Function Conversion
// JavaScript:
function add(a, b) {
return a + b;
}
function greet(name) {
return `Hello, ${name}!`;
}
// TypeScript (converted):
function add(a: number, b: number): number {
return a + b;
}
function greet(name: string): string {
return `Hello, ${name}!`;
}