TypeScript如何定义类型:实用技巧一看就懂

写前端项目时,你有没有遇到过调接口传参数,结果因为字段名写错或者数据型不对,页面直接报错?别急,TypeScript 就是来帮你提前发现这些问题的。关键之一,就是学会怎么正确地定义类型。

用 interface 定义对象结构

比如你正在开发一个用户信息模块,后端返回的数据长这样:{ id: 1, name: "张三", email: "zhangsan@example.com" }。你可以用 interface 明确告诉 TypeScript 这个对象应该有哪些字段、是什么类型。

interface User {
id: number;
name: string;
email: string;
}

之后在函数里使用,编辑器就会自动提示字段,拼错名字或传错类型都会标红提醒。

type 也能定义类型,和 interface 有啥区别?

type 更灵活,能定义基本类型的别名,也能组合复杂类型。比如你经常处理“成功”或“失败”的状态:

type Status = 'success' | 'loading' | 'error';

function showStatus(s: Status) {
console.log(s);
}

showStatus('success'); // ✅
showStatus('pending'); // ❌ 报错

这种字面量联合类型,能有效防止拼写错误,特别适合写组件的 props 或 API 状态码。

给函数也加上类型

函数参数和返回值也可以明确标注。比如你要写一个计算总价的方法:

function calculateTotal(price: number, quantity: number): number {
return price * quantity;
}

这样别人调用时就不会传个字符串进来,返回值类型也一目了然。

可选属性和只读字段

不是所有字段都必须存在。比如用户资料里,电话可能是可选的:

interface UserProfile {
name: string;
age?: number; // 可选
readonly id: number; // 只读,不能被修改
}

加上 ? 表示可选,readonly 防止意外修改,代码更安全。

泛型:让类型也支持“变量”

如果你写一个通用函数,比如返回数组第一个元素,但不确定是什么类型,可以用泛型:

function first<T>(arr: T[]): T | undefined {
return arr[0];
}

const nums = [1, 2, 3];
const firstNum = first(nums); // 类型自动推断为 number

这样既保持灵活性,又不失类型检查。

实际开发中,合理使用这些类型定义方式,能让你的代码更清晰,出错更少。尤其是团队协作时,别人一眼就能看懂你写的接口该传什么,减少沟通成本。