TypeScript — 由微软开发的一种严格类型化的JavaScript超集。它添加了类型系统、接口、泛型和装饰器,同时保持与现有JS代码的完全兼容性。得益于编译阶段的类型检查,TypeScript在React Native、Angular和其他框架中预防了整类错误。根据State of JS Survey(2025),78%的受访开发者使用TypeScript。更多信息请参阅TypeScript文档。
要点
TypeScript — 微软(2012年)推出的一种编程语言,由Anders Hejlsberg(C#和Turbo Pascal的创造者)开发。TypeScript用静态类型系统、接口、泛型、枚举和装饰器扩展了JavaScript。TS代码通过tsc或Babel编译器编译为纯JavaScript(转译)——输出是可在任何环境中运行的标准JS。
创建TypeScript的动机——JavaScript在大型项目中的局限性。JS的动态类型化导致仅在运行时才能发现的错误:undefined is not a function、Cannot read property of null。TypeScript将类型检查转移到编译阶段,在代码执行前预防这些错误。项目越大,TS的优势越显著:在100,000+行的代码库中,TS可预防数百个潜在错误。
TypeScript的关键特性——通过tsconfig.json中的可选标志strict: true实现严格类型化。在严格模式下,所有检查都启用:strictNullChecks(null/undefined与其他类型不兼容)、noImplicitAny(禁止隐式any)、strictFunctionTypes(函数参数的逆变)。默认情况下,所有新项目都建议使用strict: true。
TypeScript仅在开发阶段与JavaScript不同。编译后,类型被擦除——运行时执行普通JS而不会损失性能。这是一种折衷:开发需要额外的编译步骤,但提供了IDE中的自动完成、带符号重命名的重构以及直接在代码中的类型文档。
| 方面 | JavaScript | TypeScript |
|---|---|---|
| 类型化 | 动态,运行时 | 静态,编译时 |
| 文件扩展名 | .js | .ts(或React的.tsx) |
| 类型错误 | 在运行时发现 | 在执行前发现 |
| 泛型 | 无 | 有(泛型类型) |
| 接口 | 无(仅JSDoc) | 有(interface + type) |
| 编译 | 不需要 | 需要(tsc / Babel) |
TypeScript类型系统 — 结构类型系统(structural typing),而非名义类型系统:两个类型如果结构匹配则兼容,无论名称如何。这与Java/C#不同,后者的兼容性由类或接口的名称决定。结构类型化简化了与现有JS代码的集成——无需为每个类型声明implements。
TypeScript支持JS的原始类型以及:any(关闭检查)、unknown(安全的any——使用前需要检查)、never(从不返回)、void(无返回)、tuple(固定长度元组)、enum(枚举)、union(string | number)、intersection(A & B)、literal('red' | 'blue')、index signature([key: string]: number)。
// TypeScript基本类型系统
// 原始类型
const name: string = 'React Native';
const version: number = 0.73;
const isReady: boolean = true;
// 联合和字面量类型
type Platform = 'ios' | 'android' | 'web';
type Status = 'idle' | 'loading' | 'success' | 'error';
function getSDKVersion(platform: Platform): number {
switch (platform) {
case 'ios': return 17;
case 'android': return 34;
case 'web': return 2025;
}
}
// Tuple — 固定长度元组
type Coordinate = [number, number];
const position: Coordinate = [55.75, 37.61];
// Enum — 自动递增枚举
enum AppState {
Background,
Foreground,
Inactive
}
// Unknown — any的安全替代
function parseJSON(json: string): unknown {
return JSON.parse(json);
}
const data = parseJSON('{"name":"TS"}');
if (typeof data === 'object' && data !== null) {
console.log((data as Record<string, unknown>).name);
}Platform类型——字符串字面量的联合,将值限制为三种变体。如果传入'windows',TypeScript将报错。Coordinate元组保证恰好两个数字——这对于坐标或RGB颜色很方便。AppState枚举编译为具有反向映射的对象。Unknown强制在使用前进行类型检查——与any不同,unknown默认是安全的。
接口(interface)和类型别名(type)在TypeScript中描述对象的形状。接口可以合并(declaration merging——重复声明添加字段)和扩展(extends)。类型别名可以描述union、intersection、tuple和条件类型,但不支持declaration merging。规则:API对象使用interface,其他所有情况使用type。
// React Native的接口和类型
// 带可选字段的接口
interface User {
id: string;
name: string;
email: string;
avatar?: string; // 可选字段
readonly createdAt: Date; // 只读
}
// 接口扩展(extends)
interface AdminUser extends User {
role: 'admin';
permissions: string[];
}
// API数据的类型
type ApiResponse<T> = {
data: T;
status: Status;
error?: string;
};
// Utility types — Partial使所有字段可选
type PartialUser = Partial<User>;
// Pick — 选择指定字段
type UserPreview = Pick<User, 'id' | 'name' | 'avatar'>;
// Record — 带类型化键的字典
type UserMap = Record<string, User>;User接口带有?(可选字段)和readonly(只读)。ApiResponse<T>——API响应的泛型接口。Partial<User>——使所有字段可选的实用类型(对编辑表单很有用)。Pick<User, 'id' | 'name'>只选择指定字段——方便预览组件。Record<string, User>——按ID的用户字典。
泛型(Generics)——TypeScript的关键特性之一,允许创建与任何类型协作而不损失类型安全性的组件。泛型函数使用尖括号中的类型参数定义:function identity<T>(arg: T): T。类型T从参数自动推断或显式指定:identity<string>('hello')。
实用类型——用于类型转换的内置泛型:Partial<T>(所有字段可选)、Required<T>(所有字段必填)、Readonly<T>(所有字段只读)、Pick<T, K>(选择字段)、Omit<T, K>(排除字段)、Record<K, T>(字典)、Exclude<T, U>(排除联合)、Extract<T, U>(提取联合)、NonNullable<T>(排除null/undefined)。
// TypeScript中的泛型
// 用于API的泛型函数
async function fetchData<T>(url: string): Promise<T> {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return response.json() as Promise<T>;
}
// 使用具体类型
interface Product {
id: number;
title: string;
price: number;
}
const products = await fetchData<Product[]>('/api/products');
// 用于状态管理的泛型类
class StateManager<S> {
private state: S;
constructor(initial: S) {
this.state = initial;
}
getState(): S {
return this.state;
}
updateState(partial: Partial<S>): void {
this.state = { ...this.state, ...partial };
}
}
// 与Redux Reducer的类型化工作
type Action<T, P> = {
type: T;
payload: P;
};
type UserAction =
| Action<'SET_USER', User>
| Action<'CLEAR_USER', undefined>
| Action<'UPDATE_USER', Partial<User>>;fetchData<T>函数——围绕fetch的类型化包装器。参数T确定响应的形状:调用fetchData<Product[]>时,TypeScript知道返回的数组包含Product对象。StateManager<S>类管理任何类型的状态——Partial<S>用于部分更新。Action<T, P>——用于Redux操作的带switch中自动类型收窄的联合类型。
TypeScript在React Native中确保了组件props和状态的严格类型化。React Native CLI创建带有.tsx扩展名和tsconfig.json的模板。PropTypes(JS)被TypeScript接口替代——检查在编译阶段进行,而非运行时。styled-components和React Navigation拥有完整的类型。
React.FC<Props>——函数式组件带props的类型。子组件(children)自动类型化。useRef<T>——对原生组件的引用。useState<S>——带类型推断的状态。useNavigation<T>——类型化导航。useCallback、useMemo——带自动类型推断。所有React钩子都已完全类型化。
// 类型化React Native组件
import React, { useState, useCallback } from 'react';
import {
View, Text, FlatList, TouchableOpacity,
StyleSheet
} from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
// 导航和数据的类型
type RootStackParamList = {
Home: undefined;
Profile: { userId: string };
Settings: undefined;
};
type NavigationProp =
NativeStackNavigationProp<RootStackParamList, 'Home'>;
// props的接口
interface ProductListProps {
products: Product[];
onSelect: (id: number) => void;
}
// 类型化函数式组件
const ProductList: React.FC<ProductListProps> = ({
products,
onSelect
}) => {
const navigation = useNavigation<NavigationProp>();
const [selectedId, setSelectedId] = useState<number | null>(null);
const handlePress = useCallback((id: number) => {
setSelectedId(id);
onSelect(id);
navigation.navigate('Profile', { userId: String(id) });
}, [onSelect, navigation]);
const renderItem = useCallback(({ item }: { item: Product }) => (
<TouchableOpacity onPress={() => handlePress(item.id)}>
<Text>{item.title}</Text>
<Text>${item.price.toFixed(2)}</Text>
</TouchableOpacity>
), [handlePress]);
return (
<FlatList
data={products}
renderItem={renderItem}
keyExtractor={(item) => String(item.id)}
/>
);
};RootStackParamList类型——带参数的路径字典。NavigationProp——类型化导航:navigation.navigate('Profile', { userId })检查Profile是否接受userId。带类型化参数的useCallback防止不必要的重新渲染。FlatList通过泛型类型化:
TypeScript工具包括tsc编译器、tsconfig.json、VS Code中的IDE支持、带@typescript-eslint的ESLint、Prettier和DefinitelyTyped(@types/*)。tsc——将.ts转换为.js的编译器。tsconfig.json——配置:target(ES2020)、module(ESNext)、strict: true、outDir(输出文件夹)。sourceMap——通过代码映射在浏览器中调试TS。
DefinitelyTyped——为没有内置类型的库提供类型化的仓库。安装:npm install @types/react @types/react-native --save-dev。.d.ts文件——类型声明。现代库(React、React Native、Angular)包含内置类型,不需要@types/。对于旧版JS库,DefinitelyTyped是唯一的类型来源。
// tsconfig.json — 最小配置
{
"compilerOptions": {
"target": "esnext",
"module": "commonjs",
"strict": true,
"jsx": "react-native",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"noEmit": true // 仅检查,不生成JS
},
"include": ["src/**/*.ts", "src/**/*.tsx"],
"exclude": ["node_modules", "babel.config.js"]
}strict: true选项启用所有类型检查——建议用于所有项目。jsx: 'react-native'保持JSX不变换(React Native通过Babel处理JSX)。moduleResolution: 'node'——像Node.js一样搜索模块。esModuleInterop——与CommonJS模块兼容。noEmit: true——仅检查而不生成JS文件(Babel或Metro生成JS)。
常见问题
TypeScript — 微软(2012年)推出的一种严格类型化的JavaScript超集。添加了静态类型化、接口、泛型、枚举和装饰器。通过tsc编译为纯JS。与任何JS代码兼容。用于React Native(约65%的新项目)、Angular和Node.js。由Anders Hejlsberg(C#的创造者)开发。
TypeScript提供了React组件props和状态的严格类型化——类型错误在编译阶段发现,而非运行时。IDE的自动完成为所有库工作。泛型类型化复杂结构(Redux store、API)。React Navigation拥有完整的路由类型化。根据调查,78%的JS开发者使用TypeScript。
tsc编译器解析.ts/.tsx文件,检查类型,删除注解并生成.js。Target(ES5、ES2020)在tsconfig.json中设置。TypeScript不改变运行时——擦除的类型不会影响性能。Source maps将编译后的JS与原始TS关联以进行调试。带@babel/preset-typescript的Babel——tsc的替代方案。
TypeScript包含所有JS类型:string、number、boolean、null、undefined、symbol、any。添加了:void、never、unknown、tuple、enum、union(string | number)、intersection(A & B)、literal('red' | 'blue')、Record、Pick、Omit、Partial、Required、Readonly、Extract、Exclude、NonNullable。泛型创建通用类型:Array<number>、Promise<string>、Map<string, User>。
tsc编译器包含在typescript npm包中。VS Code——带有原生TS支持、自动完成、重构的IDE。tsconfig.json配置严格模式。带@typescript-eslint/parser的ESLint——静态分析。Prettier——格式化。DefinitelyTyped(@types/*)——为没有内置支持的库提供类型。React Native CLI包含TypeScript模板。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。