类型约束 和 编译结果对比
TS是一个可选的静态的类型系统 编译成js之后,就啥都不管啦
如何进行类型约束
有了约束后,才能进行类型检查。一般要对 变量、函数的参数&返回值等 的后面加上 :类型
类型约束后,不可修改变量类型!
- TS在很多场景中可以完成类型推导
- 若用F2,修改变量名字,则自动更改这个变量所有位置的名字
- F12可以跳到函数定义的地方
- let anyVar;//这个anyVar是any类型,可以再次多次被赋值为任意类型,因为TS不会对any进行类型检查
- 小技巧:如何区分 数字字符串和数字?关键看怎么读
基本类型
- number: 数字
- string: 字符串
- boolean: 布尔
- 数组:
- let nums: []; //不报错,但是代表它永远只能取值为一个空数组,里面就是never类型!
- let nums: number[]; //每一项都是数字的数组,它实际是下述写法的语法糖,推荐这么写
- let nums: Array
= [3, 4, 5]; //这是完整写法但是,这么写容易跟组件搞混了
- 对象:
- let obj: object; //这个约束并不强,不精准
- null 和 undefined:
- 联合类型:多种类型任选其一,配合类型保护进行判断
- let name: string | undefined; //string或者undefined
- 类型保护:当对某个变量进行类型判断(typeof可以触发普通基本类型保护,对象不行)之后,在判断的语句话中便可以确定它的确切类型
- void类型:通常用于约束函数的返回值,表示该函数没有任何返回值,这不是undefined
- never类型:通常用于约束函数的返回值,表示该函数永远不会结束
- 常用于抛出错误函数的返回值
- 死循环函数
字面量类型:使用一个值进行约束,强力的约束,浅层对比约束;一般不使用这种方式
let ccc: {name: string, obj:object};
ccc = {name:'324', obj:{ok: 'ok'}};
console.log(ccc);//{ name: '324', obj: { ok: 'ok' } }
ccc.name = '4252';
ccc.obj = {ok: 324}
console.log(ccc);//{ name: '4252', obj: { ok: 324 } }
元组(Tuple)类型:一个固定长度的数组,数组中每一项的类型也确定
- let tu: [string, number] = [“3”, 4];
- any类型:any类型可以绕过类型检查,因此,any类型的数据可以赋值给任意类型,故也会造成隐患
类型别名
就是为了解决这种重复代码的问题:
类型别名:使用type ,对已知的一些类型定义名称,而且还可以进行组合嵌套!
注意,它不会出现在编译结果中,尴尬!
type Gender = '男' | '女';
type User = {
name: string//这里不管是用逗号 分号 还是不写,都不报错,无语..
age: number
gender: Gender
}
let u:User;
u = {
name: "wujingwei",
gender: "男",
age: 22
}
function getUsers(g: Gender):User[]{
return [];
}
getUsers('男');
函数的相关约束
- 函数重载:在函数定义之前,对函数调用的多种情况进行声明 ```typescript function combine(a:number, b:number):number;//得到a*b的结果 function combine(a:string, b:string):string;//得到a与b拼接的结果
function combine(a: number | string, b: number | string): number | string{ if(typeof a === ‘number’ && typeof b === ‘number’){ return a * b; }else if(typeof a === ‘string’ && typeof b === ‘string’){ return a + b; }else{ throw new Error(‘a和b必须是相同的类型,且是number或string’); } }
const result = combine(3, 4); combine(3, “3”);//这样这句在静态的时候,编译器就会在这里报红色error了,通不过编译
2. 可选参数:可以在某些参数名后面加上 **问号?**,表示可选可不选,即 ?:
1. **可选参数必须出现在参数列表的最后一个! **
<br />
<a name="xF8RG"></a>
# 扑克牌小练习
1. 目标:创建一副扑克牌(不包括大小王),打印该扑克牌
```typescript
//一副牌
type Deck = NormalCard[];
//花色
type Color = '♥️'|'♠️'|'♦️'|'♣️';
//一张牌
type NormalCard = {
// color: string,//花色, 进行一下限制, 因为总共就四种
color: Color,
mark: number,//序号
};
function createDeck(): Deck {
const deck: Deck = [];
for (let i = 1; i <= 13; i++) {
deck.push({
mark: i,
color: '♥️',
});
deck.push({
mark: i,
color: '♠️',
});
deck.push({
mark: i,
color: '♦️',
});
deck.push({
mark: i,
color: '♣️',
});
}
return deck;
}
function printDeck(deck: Deck): void{
const len = deck.length;
for (let i = 0; i < len; i++) {
const card = deck[i];
let str = card.color;
if(card.mark <= 10){
str += ' '+card.mark;
}else if(card.mark === 11){
str += ' J';
}
else if(card.mark === 12){
str += ' Q';
}else if(card.mark === 13){
str += ' K';
}
console.log(str);
}
}
const deck = createDeck();
printDeck(deck);
感觉就是,好智能啊,很多提示!!