TypeScript(简称 TS)是 JavaScript 的超集,在 JS 基础上新增了静态类型系统,主要解决了动态类型带来的类型模糊、报错滞后、重构困难等问题,已成为大型前端项目、框架开发(如 Vue 3、React 18)的首选语言。今天我就带大家来看一下TypeScript 的核心特性。下面正文开始。
TypeScript 由微软于 2012 年推出,是 “JavaScript + 静态类型系统” 的组合 —— 它完全兼容 JavaScript 语法,同时通过类型注解、接口、泛型等特性,在代码编写阶段(而非运行时)检测类型错误,提前规避潜在 bug。
TS 的核心目标是:
很多开发者会混淆两者的使用场景,核心是 “增强版” 与 “基础版” 的关系:
这里给大家补充一下:TS 的发展里程碑
TS 的核心是 “类型”,通过简单的注解语法,可给变量、函数参数、返回值指定类型,IDE 会实时校验,开发者也能快速理解数据结构。
// 变量类型注解:格式为“变量名: 类型”
let username: string = "zhangsan"; // 字符串类型
let age: number = 25; // 数字类型(含整数、浮点数)
let isActive: boolean = true; // 布尔类型
let emptyValue: null = null; // null类型
let undefinedValue: undefined = undefined; // undefined类型
// 核心优势:类型错误实时提示
username = 123; // 报错:Type 'number' is not assignable to type 'string'函数类型注解(参数 + 返回值)
// 函数参数类型 + 返回值类型(返回值可省略,TS会自动推导)
function add(a: number, b: number): number {
return a + b; // 若返回字符串,会直接报错
}
// 无返回值的函数(void类型)
function logInfo(msg: string): void {
console.log(msg);
}
// 调用时类型不匹配,IDE直接报错
add(10, "20"); // 报错:Argument of type 'string' is not assignable to parameter of type 'number'数组类型(两种写法)
// 写法1:类型[]
let numArr: number[] = [1, 2, 3];
numArr.push("4"); // 报错:类型不匹配
// 写法2:Array<类型>(泛型语法,后续详解)
let strArr: Array<string> = ["a", "b", "c"];
// 联合类型数组(允许多种类型)
let mixedArr: (number | string)[] = [1, "a", 2];对于对象、函数等复杂类型,接口(Interface)可清晰描述其 “结构规范”,相当于一份 “数据契约”,确保不同地方使用的数据格式一致,尤其适合前后端交互、组件传参场景。
// 定义用户接口(规定必须包含的属性及类型)
interface User {
id: number; // 必选属性
name: string;
age?: number; // 可选属性(?表示可缺省)
readonly role: string; // 只读属性(初始化后不可修改)
}
// 符合接口规范的对象(正确)
const user1: User = {
id: 1,
name: "zhangsan",
role: "admin"
};
// 缺少必选属性(报错)
const user2: User = {
name: "lisi",
role: "user" // 报错:Property 'id' is missing in type
};
// 修改只读属性(报错)
user1.role = "superadmin"; // 报错:Cannot assign to 'role' because it is a read-only property定义函数结构
// 定义接口描述函数格式
interface Calculate {
(a: number, b: number): number;
}
// 实现接口(函数参数和返回值必须符合接口规范)
const multiply: Calculate = (x, y) => x * y;
const subtract: Calculate = (x, y) => x - y;
multiply(3, 4); // 正确,返回12
multiply(3, "4"); // 报错:参数类型不匹配接口继承(复用结构)
// 基础接口
interface BaseUser {
id: number;
name: string;
}
// 继承BaseUser,新增属性
interface AdminUser extends BaseUser {
role: "admin";
permissions: string[];
}
// 符合AdminUser接口的对象
const admin: AdminUser = {
id: 2,
name: "wangwu",
role: "admin",
permissions: ["create", "delete"]
};泛型是 TS 的核心特性之一,允许在定义函数、接口、类时不指定具体类型,而是在使用时动态传入类型,实现 “一次定义,多类型复用”,避免重复编写相似代码。
// 泛型函数:用<T>表示类型占位符,使用时指定具体类型
function identity<T>(value: T): T {
return value; // 输入类型与返回类型一致
}
// 使用时指定类型(或让TS自动推导)
const str = identity<string>("hello"); // 类型为string
const num = identity(123); // 自动推导为number类型
// 实用场景:处理数组的通用函数
function getFirstElement<T>(arr: T[]): T | undefined {
return arr[0];
}
const firstNum = getFirstElement([1, 2, 3]); // 类型为number
const firstStr = getFirstElement(["a", "b"]); // 类型为string泛型接口
// 泛型接口:定义可复用的结构模板
interface Result<T> {
code: number;
message: string;
data: T; // 数据类型动态指定
}
// 后端返回用户列表的响应格式
type UserListResult = Result<User[]>;
const userRes: UserListResult = {
code: 200,
message: "success",
data: [{ id: 1, name: "zhangsan" }, { id: 2, name: "lisi" }]
};
// 后端返回单个商品的响应格式
type GoodsResult = Result<{ id: number; price: number }>;
const goodsRes: GoodsResult = {
code: 200,
message: "success",
data: { id: 100, price: 99 }
};类型别名用type关键字定义,可给复杂类型(如联合类型、交叉类型)起一个简洁的名字,提升代码可读性,与接口功能部分重叠,但更灵活(支持基本类型、联合类型等)。
// 1. 简化基本类型(无太大意义,仅示例)
type MyString = string;
let str: MyString = "hello";
// 2. 简化联合类型(常用)
type Status = "pending" | "success" | "failed";
let taskStatus: Status = "pending";
taskStatus = "error"; // 报错:不在允许的类型范围内
// 3. 简化交叉类型(合并多个类型)
type Name = { name: string };
type Age = { age: number };
type Person = Name & Age; // 同时包含name和age属性
const person: Person = {
name: "zhangsan",
age: 25
};
// 4. 简化函数类型
type AddFunc = (a: number, b: number) => number;
const add: AddFunc = (x, y) => x + y;TS 内置了一系列实用高级类型,可快速转换已有类型的属性特征(如可选、必选、只读),无需重复定义相似接口。
interface User {
id: number;
name: string;
age: number;
}
// Partial<User> 等价于 { id?: number; name?: string; age?: number }
type PartialUser = Partial<User>;
const updateUser = (user: User, changes: PartialUser): User => {
return { ...user, ...changes }; // 仅更新传入的属性
};
const user = { id: 1, name: "zhangsan", age: 25 };
updateUser(user, { age: 26 }); // 正确,仅修改age
updateUser(user, { gender: "male" }); // 报错:属性gender不存在Required:将所有属性转为必选
interface PartialUser {
id?: number;
name?: string;
}
// Required<PartialUser> 等价于 { id: number; name: string }
type RequiredUser = Required<PartialUser>;
const user: RequiredUser = {
id: 1 // 报错:缺少必选属性name
};Readonly:将所有属性转为只读
type ReadonlyUser = Readonly<User>;
const user: ReadonlyUser = { id: 1, name: "zhangsan", age: 25 };
user.age = 26; // 报错:无法修改只读属性类型守卫通过特定语法,在运行时判断变量的具体类型,让 TS 在代码块内精准识别类型,避免使用as类型断言带来的风险。
function formatValue(value: string | number) {
if (typeof value === "string") {
// 代码块内TS自动识别value为string类型
return value.toUpperCase();
}
// 代码块内TS自动识别value为number类型
return value.toFixed(2);
}
formatValue("hello"); // 输出 "HELLO"
formatValue(123.456); // 输出 "123.46"instanceof 类型守卫(引用类型判断)
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
}
class Dog extends Animal {
bark() {
console.log("wangwang");
}
}
class Cat extends Animal {
meow() {
console.log("miaomiao");
}
}
function animalAction(animal: Animal) {
if (animal instanceof Dog) {
// 识别为Dog类型,可调用bark方法
animal.bark();
} else if (animal instanceof Cat) {
// 识别为Cat类型,可调用meow方法
animal.meow();
}
}
animalAction(new Dog("旺财")); // 输出 "wangwang"自定义类型守卫(复杂场景)
interface Fish {
swim: () => void;
}
interface Bird {
fly: () => void;
}
// 自定义类型守卫:返回值为 boolean,参数类型为类型谓词
function isFish(animal: Fish | Bird): animal is Fish {
return (animal as Fish).swim !== undefined;
}
function animalMove(animal: Fish | Bird) {
if (isFish(animal)) {
animal.swim();
} else {
animal.fly();
}
}TS 完全兼容 ES6 模块系统,同时支持通过 “类型声明文件(.d.ts)” 为无类型的 JS 库添加类型提示,解决第三方库无智能提示的问题。
// user.ts:导出类型和函数
export interface User {
id: number;
name: string;
}
export function getUser(): User {
return { id: 1, name: "zhangsan" };
}
// main.ts:导入使用
import { User, getUser } from "./user";
const user: User = getUser();对于无类型的 JS 库(如自定义工具库),可创建.d.ts文件添加类型:
// utils.d.ts:声明JS库的类型
declare module "utils" {
export function formatDate(date: Date): string;
export const version: string;
}
// 使用时自动获得类型提示
import { formatDate } from "utils";
formatDate(new Date()); // 正确,IDE提示参数类型这里总结一下ts和js核心的差异对比

关于ts,这里给大家总结一些实战的建议和避坑。
最后简单总结一下,TypeScript 的核心价值在于 “静态类型系统”,通过类型注解、接口、泛型等特性,将 JavaScript 从 “动态弱类型” 升级为 “静态强类型”,解决了大型项目开发中的类型模糊、协作低效、重构困难等问题。
对于我们前端开发者而言,TS 已不是 “可选技能”,而是 “必备技能”—— 掌握其核心特性,既能提升个人开发效率,也能适配主流框架和企业级项目的需求。建议从基础类型、接口、泛型入手,结合实际项目逐步落地,最终形成类型安全的编码习惯。好了,今天的分享就到这里,希望文章可以帮助到大家。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。