一、类型推论
- TypeScript会在没有明确的指定类型的时候推测出一个类型,这就是类型推论
- 如果没声明变量,没定义类型,也没赋值,这时候TS会推断成any类型可以进行任何操作
let str
str = 456
str = null
二、类型别名
type关键字
(可以给一个类型定义一个名字)多用于复合类型
1. 定义类型别名
/* 定义类型别名 */
type str = string
let s:str = '我是小青'
console.log(s);
2. 定义函数别名
/* 定义函数别名 */
type str = () => string
let s: str = () => '我是小青'
console.log(s);
3. 定义联合类型别名
/* 定义联合类型别名 */
type str = string | number
let s1:str = 123
let s2: str = '123'
console.log(s1, s2);
4. 定义值的别名
// 定义值的别名
type value = boolean | 0 | '213'
//变量s的值 只能是上面value定义的值
let s:value = true
console.log(s);
5. type 和 interfaces的区别
- interface使用extends继承,type使用&继承。
type s = number [] & B
interface A extends B {
}
interface B {
}
- type可以声明联合类型和元组类型,interface不行
type s = number[] | B
interface A extends B {
name: string | number
}
interface B {
}
- interface可以实现声明合并,而type不行
interface test {
name: string
}
interface test {
age: number
}
/*
test实际为 {
name: string
age: number
}
*/
6. type高级用法
- extends有包含的意思,左边的值,会作为右边类型的子类型
type a1 = 1 extends number ? 1 : 0 //1
type a2 = 1 extends Number ? 1 : 0 //1
type a3 = 1 extends Object ? 1 : 0 //1
type a4 = 1 extends any ? 1 : 0 //1
type a5 = 1 extends unknown ? 1 : 0 //1
type a6 = 1 extends never ? 1 : 0 //0
三、never类型
1. never的使用
- TypeScript将使用never类型来表示不应该存在的状态
type A = '唱' | '跳' | 'rap'
function kun (value:A){
switch(value){
case '唱': break
case '跳': break
case 'rap': break
default:
// 兜底逻辑
const error: never =value;
break
}
}
2. never与void的差异
- void类型只是没有返回值,但本身不会出错;nerve只会抛出异常没有返回值
//void类型只是没有返回值 但本身不会出错
function Void(): void {
console.log();
}
//只会抛出异常没有返回值
function Never(): never {
throw new Error('aaa')
}
- 当我们鼠标移上去的时候会发现,只有void和number。never在联合类型中会被直接移除