TypeScript篇二 ---类型别名、接口、元组、类型推断、字面量类型

类型别名

相当于是给一个类型起一个新名字,例如将一个数字和字符串组成的数组起一个类型别名,只要有数据是这个类型,都可以用类型别名指定

type CustomArray = (number | string)[]

let arr: CustomArray = [1, 2, 3, 'a', 'b', 'c']
// 相当于就是
let arr: (number | string)[] = [1, 2, 3, 'a', 'b', 'c']

type girls = "邱淑贞" | "唐嫣" | "迪丽热巴" | "赵露思";

let oneGirl: girls = "唐嫣" // 只能是girls里面的其中之一

接口

和类型别名类似,它也可以指定类型

// 用 interface去声明一个接口
interface Person13 {
  name: string
  age: number
  sayHi(): void
}

type Person2 = {
  name: string
  age: number
  sayHi(): void
}

// 直接使用接口名称作为变量的类型
let zs13: Person13 = {
  name: '张三',
  age: 18,
  sayHi: () => {
    console.log('我是张三');
  }
}

let ls13: Person13 = {
  name: '李四',
  age: 20,
  sayHi: () => {
    console.log('我是李四');
  }
}

let ls14: Person2 = {
  name: '李四',
  age: 20,
  sayHi: () => {
    console.log('我是李四');
  }
}

两者的比较

  1. 接口可以指明一个变量里面能拥有哪些东西,使用interface声明;类型别名与接口类似,是为一个类型取一个新名字,使用type来声明。
  2. 都可以扩展,interface使用“extends”扩展,type使用“&”扩展 。
  3. type 可以声明基本类型别名,联合类型,元组等类型,可以使用typeof,而interface不可以, interface可以不断联合扩展,type不可以。

接口和类型别名目前还没有深入去了解,后续做补充

接口的继承

接口继承就是接口可以通过其他接口来扩展自己,接口可以继承多个接口,使用关键字extends实现继承

下面是一个继承的例子

// 2D存在x和y两个属性
interface Point2D { 
  x: number
  y: number
}

// Point3D通过继承扩展自己
interface Point3D extends Point2D { z: number }

// 扩展之后就有了Point2D的属性
let p3: Point3D = {
  x: 1,
  y: 2,
  z: 3
}

如果想要继承多个接口,可以在要继承的接口直接用 , 分割,实现继承多接口的效果

元组

个人理解就是一个特定的数组,就像正方形是特殊的矩形一样,元组就是指定数组长度以及数组每一项数据类型的数组,见下:

let positon: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // 只限制了数组是一个数字数组,长度不限

// 元组写法
// 指定了一个只有两项的数组,并且数组第一项为number类型,第二项为字符串类型
let positon1: [number, string] = [1, '2'] // 指定数组长度,且规定每一项的数据类型,只要不符合规定就会报错

类型推断

类型推断是ts的一种机制,两种场景下存在类型推断

声明变量并且初始化时

// 声明age并且初始值是18,会产生类型推断,指定age为number型,如果要修改age为其他类型的值时,会进行报错提示
let age = 18

// 相当于对 let age:number = 18 进行了简写

age = '18' // 报错,不能将类型“string”分配给类型“number”。ts(2322)
  • 注意,只有在给定初值的时候才会产生类型推断,不赋初值不存在类型推断
//^ 如果你初始化为给初值时,类型推断机制会失效
let a

//^ 此时可以随意赋值
a = 18
a = '18'

函数返回值存在类型推断

function add(num1: number, num2: number) {
  return num1 + num2 // 两个参数是number,ts会自动识别到返回值类型是number
}

相当于对下面进行简写,省去了:number
function add(num1: number, num2: number) :number {
  return num1 + num2 
}

注意

函数参数不能省略定义数据类型,否则不生效

function add1(num1, num2: number) {
  return num1 + num2 // 两个参数是number,ts会自动识别到返回值类型是number
}

//^ 此时第一个参数的数据类型可以随便写
add1('1', 2)
add1(false, 2)

字面量类型

用const 声明的简单数据类型的变量就是字面量

const str2 = 'HELLO TS' // 数据类型为'HELLO TS'

// str2是一个常量,无法修改,是一个字面量

字面量可以直接当数据类型声明

const str3: 'hello ts' = 'hello ts' // str3的值只能是hello ts
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,让我来回答你的问题。 1. TypeScript类型保护与区分类型 类型保护是 TypeScript 中用来区分不同类型的机制,可以通过 typeof、instanceof、in 等运算符来实现。例如: ```typescript function printLength(strOrArr: string | any[]) { if (typeof strOrArr === 'string') { console.log(strOrArr.length); // string类型 } else { console.log(strOrArr.length); // 数组类型 } } ``` 2. TypeScript 的联合类型 联合类型是指变量可以是多种不同类型之一,可以使用“|”符号将多个类型组合起来。例如: ```typescript let numOrStr: number | string = 5; numOrStr = "hello"; ``` 3. TypeScript 的交叉类型 交叉类型是指将多个类型合并成一个类型,可以使用“&”符号将多个类型组合起来。例如: ```typescript interface A { a: number; } interface B { b: string; } type C = A & B; const c: C = { a: 1, b: "hello" }; ``` 4. TypeScript类型别名 类型别名是为一个类型定义一个别名,可以使用“type”关键字来定义。例如: ```typescript type MyString = string; const str: MyString = "hello"; ``` 5. TypeScript接口 vs. 类型别名 接口类型别名都可以用来定义类型,但有一些不同之处。接口可以被类实现,也可以被扩展,而类型别名只能定义别名。例如: ```typescript interface Person { name: string; age: number; } type PersonAlias = { name: string; age: number; }; class Student implements Person { name: string; age: number; grade: number; constructor(name: string, age: number, grade: number) { this.name = name; this.age = age; this.grade = grade; } } type StudentAlias = PersonAlias & { grade: number; }; const student: StudentAlias = { name: "Tom", age: 18, grade: 3 }; ``` 6. TypeScript 的字符串字面量类型 字符串字面量类型是指将字符串字面量作为类型,可以使用“|”符号将多个字符串字面量组合起来。例如: ```typescript type Gender = "male" | "female"; interface Person { name: string; age: number; gender: Gender; } const person: Person = { name: "Tom", age: 18, gender: "male" }; ``` 希望这些解释能够对你有所帮助。如果你还有其他问题,可以继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不断蜕变灬青春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值