javascript-typescript
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseJavaScript/TypeScript Development
JavaScript/TypeScript 开发
TypeScript Configuration
TypeScript 配置
json
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"skipLibCheck": true,
"declaration": true,
"outDir": "./dist"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}json
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"skipLibCheck": true,
"declaration": true,
"outDir": "./dist"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}Type Patterns
类型模式
Utility Types
工具类型
typescript
// Pick specific properties
type UserPreview = Pick<User, 'id' | 'name'>;
// Omit properties
type CreateUser = Omit<User, 'id' | 'createdAt'>;
// Make all properties optional
type PartialUser = Partial<User>;
// Make all properties required
type RequiredUser = Required<User>;
// Extract union types
type Status = 'pending' | 'active' | 'inactive';
type ActiveStatus = Extract<Status, 'active' | 'pending'>;typescript
// 选取特定属性
type UserPreview = Pick<User, 'id' | 'name'>;
// 忽略属性
type CreateUser = Omit<User, 'id' | 'createdAt'>;
// 将所有属性设为可选
type PartialUser = Partial<User>;
// 将所有属性设为必填
type RequiredUser = Required<User>;
// 提取联合类型
type Status = 'pending' | 'active' | 'inactive';
type ActiveStatus = Extract<Status, 'active' | 'pending'>;Discriminated Unions
可辨识联合类型
typescript
type Result<T> =
| { success: true; data: T }
| { success: false; error: Error };
function handleResult<T>(result: Result<T>) {
if (result.success) {
console.log(result.data); // T
} else {
console.error(result.error); // Error
}
}typescript
type Result<T> =
| { success: true; data: T }
| { success: false; error: Error };
function handleResult<T>(result: Result<T>) {
if (result.success) {
console.log(result.data); // T 类型数据
} else {
console.error(result.error); // 错误对象
}
}Generic Constraints
泛型约束
typescript
interface HasId {
id: string | number;
}
function findById<T extends HasId>(items: T[], id: T['id']): T | undefined {
return items.find(item => item.id === id);
}typescript
interface HasId {
id: string | number;
}
function findById<T extends HasId>(items: T[], id: T['id']): T | undefined {
return items.find(item => item.id === id);
}Modern JavaScript
现代 JavaScript
Destructuring & Spread
解构与展开
javascript
const { name, ...rest } = user;
const merged = { ...defaults, ...options };
const [first, ...others] = items;javascript
const { name, ...rest } = user;
const merged = { ...defaults, ...options };
const [first, ...others] = items;Optional Chaining & Nullish Coalescing
可选链与空值合并
javascript
const city = user?.address?.city ?? 'Unknown';
const count = data?.items?.length ?? 0;javascript
const city = user?.address?.city ?? 'Unknown';
const count = data?.items?.length ?? 0;Array Methods
数组方法
javascript
const adults = users.filter(u => u.age >= 18);
const names = users.map(u => u.name);
const total = items.reduce((sum, item) => sum + item.price, 0);
const hasAdmin = users.some(u => u.role === 'admin');
const allActive = users.every(u => u.active);javascript
const adults = users.filter(u => u.age >= 18);
const names = users.map(u => u.name);
const total = items.reduce((sum, item) => sum + item.price, 0);
const hasAdmin = users.some(u => u.role === 'admin');
const allActive = users.every(u => u.active);React Patterns
React 模式
typescript
// Props with children
interface CardProps {
title: string;
children: React.ReactNode;
}
// Event handlers
interface ButtonProps {
onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;
}
// Custom hooks
function useLocalStorage<T>(key: string, initial: T) {
const [value, setValue] = useState<T>(() => {
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initial;
});
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue] as const;
}typescript
// 包含子元素的属性
interface CardProps {
title: string;
children: React.ReactNode;
}
// 事件处理器
interface ButtonProps {
onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;
}
// 自定义 Hook
function useLocalStorage<T>(key: string, initial: T) {
const [value, setValue] = useState<T>(() => {
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initial;
});
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue] as const;
}Node.js Patterns
Node.js 模式
typescript
// ES Modules
import { readFile } from 'node:fs/promises';
import { join } from 'node:path';
// Error handling
process.on('unhandledRejection', (reason) => {
console.error('Unhandled Rejection:', reason);
process.exit(1);
});typescript
// ES 模块
import { readFile } from 'node:fs/promises';
import { join } from 'node:path';
// 错误处理
process.on('unhandledRejection', (reason) => {
console.error('未处理的拒绝:', reason);
process.exit(1);
});