原始类型与类型注解
本节目标
- 掌握 TS 的全部原始(基础)类型
- 学会给变量、函数参数、返回值写类型注解
- 理解「类型注解」和「类型推断」的配合
TS 的原始类型基本对应 JS 的基础值:string、number、boolean、null、undefined、symbol、bigint,再加一个特殊的 void(常用于函数无返回值)。
// 运行环境:Node.js 16+ + typescript
// 类型检查:npx tsc --noEmit ts-l3.ts
// 1) 显式类型注解:用英文冒号写在变量名后面
let title: string = '前端学习网'
let count: number = 8
let isOnline: boolean = true
// 2) 函数参数与返回值都标类型
function add(a: number, b: number): number {
return a + b
}
// 调用时传错类型,编译器立刻报错
// add('1', 2) // ❌ Argument of type 'string' is not assignable to 'number'
// 3) 不写注解时,TS 会「推断」类型(这里推断 title2 为 string)
let title2 = '推断出来的字符串'
// title2 = 123 // ❌ 推断为 string 后再赋数字会报错
// 4) 特殊原始类型
let big: bigint = 9007199254740993n // 大整数,需要 ES2020+
let nothing: null = null
let notSet: undefined = undefined重要观念:类型注解是「你主动告诉编译器」,类型推断是「编译器猜」。绝大多数时候你能省则省,让编译器推断;只有编译器猜不准(如函数参数、返回值、对象结构)时才显式写注解。
名词解释
类型注解(Type Annotation):用 变量名: 类型 的语法「显式告诉 TS 这个东西应该是什么类型」。它像给变量发一张「身份证」,TS 之后就按这张证来查你。
类型推断(Type Inference):你不写注解时,TS 根据「初始值」自动猜出类型。比如 let x = 5 会被推断成 number。推断让代码更干净,但函数参数因为没有初始值,TS 推断不出,必须你写注解。
课后练习
练习 1:下面哪些行会报错?为什么?
let a = 10
a = 'ten'
let b: number = 10
b = 20答案:第二行
a = 'ten'报错。因为a没写注解,TS 从初始值10推断出a: number,再赋字符串就类型冲突。b显式标注number,后面赋20合法。
练习 2:写一个函数 formatPrice,接收 number 价格,返回带 ¥ 的字符串,并标注完整类型。
答案:
function formatPrice(price: number): string { return `¥${price.toFixed(2)}` }
总结
我的看法是:类型注解要用在「边界」上,而不是处处都写。函数的参数、返回值、对外暴露的接口,是最该写注解的地方——因为它们是「你和调用方之间的契约」。而函数内部的局部变量,交给推断更省心,代码也更易读。新手常犯两个极端:要么全不写(失去 TS 意义),要么每行都写(啰嗦且掩盖推断能力)。把握好「边界写、内部省」这个度,TS 才算真正用顺了。