基础类型
什么是值 (value)
什么是类型
- 元类型 (primitive types)
- number boolean undefined void string symbol null
- 对象类型 (object types)
- 帮助 TS 编译器分析代码
- 帮助其它工程师去理解整个代码库里面存在的值到底是什么东西,尤其在大型项目
类型注解
我们告诉 TypeScript 值的类型是什么
手动
var 变量:类型变量类型注解
```typescript //原类型 let score: number = 50; let sports: string = ‘basketball’; let isHappy: boolean = true;
let nothingMuch: null = null; let nothing: undefined = undefined;
let today: Date = new Date();
//对象类型 //数组 let balls: string[] = [‘basketball’, ‘football’, ‘volleyball’]; let someNums: number[] = [1, -5, 0]; let truths: boolean[] = [true, true, false];
//类 class Car{} let car: Car = new Car();
//对象字面量(变量) let person: {name: string; age: number} = { name: ‘张三’, age: 20 }
//函数字面量(变量) 参数、返回值 const logNumber: (num: number) => void = (num) => {}
<a name="QqQf2"></a>## 函数类型注解```typescript//参数、返回值//TS只检查类型,不会检查逻辑const addNums = (a: number, b: number): number => {return a + b;}//TS 会推断返回值的类型(但一般不建议使用)const sustractNums = (a:number, b:number) => {//如果此处是忘记 return,TS 会认识是返回 void 类型//所以对函数的返回值作类型注解的必要就出来了a - b;}//函数声明的注解方式function multiply(a:number, b:number): number {return a * b;}//匿名函数的注解方式const divide = function(a:number, b:number): number {return a / b;}//函数没有返回值(即返回 null 或 undefined ),用voidconst logger = (message: string): void => {console.log(message);}//never 函数永远不会有尽头的const throwError = (message: string): never => {throw new Error(message);}//如果有可能有尽头,就不会使用 neverconst throwError = (message: string): void => {if(!message){throw new Error(message);}}// 函数解构注解const todayWeather = {date: new Date(),weather: '晴天'}const logWeather = ({date,weather}: {date: Date,weather: string}): void => {console.log(date);console.log(weather);}
对象注解
const profile = {name: 'Mike',age: 20,coords: {lat: 30,lng: 50},setAge(age: number): void {this.age = age;}}const { age }: { age: number} = profile;const {coords: {lat, lng}}: { coords: { lat: number; lng: number} } = profile;const { age, name }: { age: number; name: string } = profile;
类型推断
当变量声明 和变量初始化 在同一行的时候,TypeScript 尝试去推断值的类型
自动
const today = new Date(); //会根据值来推断变量的类型
所以使用 TS 的副作用:无论我们是不是想要,都会分配一个类型。
什么时候使用类型注解、什么时候使用类型推断
类型注解
当一个函数返回 any 类型,但我们想要明确具体类型
const json = '{"name": "张三", "age": 20}'; const person: {name: string; age: number} = JSON.parse(json);当某一行声明变量了之后在另一行进行初始化
let score: number; score = 50;当我们想要一个变量拥有一个不能推断出来的类型 ```typescript let numbers = [-10, 0, 1]; // 联合类型 let numAboveZero: boolean | number = false;
for(let i = 0; i < numbers.length; i++){ if(numbers[i] > 0){ numAboveZero = numbers[i]; } }
- 类型推断
- 尽可能多
<a name="zX0Z8"></a>
# Any类型
1. 一种类型
1. 和字符串类型、布尔类型一样
2. 意味TS不知道正确的类型
1. 没法检查代码
3. 尽量避免变量的类型为 any
<a name="3wdHS"></a>
# 数组类型
**类型化数组**<br />组里的元素都是同一种类型
```typescript
const dates = [new Date(), new Date()];
//多维数组
const students = [
['a','b','c'],
['d'],
['e','f']
]
为什么用类型化数组
- 提取值的时候帮助推断
- 防止加入不一样类型的值
- 使用 map、forEach、reduce 函数时提供帮助
- 灵活性
- 数组依旧可以容纳不同类型
元组
tuple
和数组很类似的数据结构,每一个元素从莆一个记录的不同属性
const drink = {
color: 'brown',
carbonated: true,
sugar: 35
};
//tuple
const pepsi: [string, boolean, number] = ['brown', true, 35];
//类型别名
type Drink = [string, boolean, number];
const sprite: Drink = ['clear', true, 40];
const tea: Drink = ['brown', false, 0];
什么时候使用元组
一般来说很少使用到元组类型,个别例子如 CSV 文件操作时可能用到。
元组最大的弊端是会丢失一些很重要的信息,所以 JavaScript 对象会有更多的信息。
//农场 鸡、鸭 的个数
const farm: [number, number] = [6, 8]; //丢失key
//所以更倾向于JS对象表示
const farm = {
chick: 6,
duck: 8
}
接口
在 TS 中大量使用到 接口 + 类 -> 高度利用的代码
定义
创建一个新的类型,来描述一个对象的属性名和属性值。
interface Person {
name: string;
age: number;
married: boolean;
born?: Date;
summary(): string;
}
const uncleMike = {
name: 'Mike',
age: 20,
married: false,
summary(): string{
return `名字: ${person.name}`;
}
}
/*
const printPerson = (person: {name: string; age: number; married: boolean}): void => {
console.log(`名字: ${person.name}`);
console.log(`年龄: ${person.age}`);
console.log(`结婚没? ${person.name}`);
}
*/
//person 的类型定义很长,如果还有另外一个 person 对象也要定义就非常麻烦
//这时可以用接口来解决
const printPerson =
// (person: {name: string; age: number; married: boolean}): void => {
(person: Person): void => {
console.log(`名字: ${person.name}`);
console.log(`年龄: ${person.age}`);
console.log(`结婚没? ${person.name}`);
consoel.log(person.summary());
}
printPerson(uncleMike);
类
步骤
- 定义对象方法
-
访问修饰符
public 默认
在任何中地方调用
private
只能在这个类调用
proteced
只能在这个类或其子类调用继承
```typescript class Person { scream(): void { console.log(‘ahhh’); }
sing(): void { console.log(‘lalala’); } }
class Men extends Person{ //子类重载 sing(): void { console.log(‘woohoooo!); } } ```

