TypeScript 第四章:interface 与 type


Interface

接口用于描述类和对象的结构

  • 使项目中不同文件使用的对象保持统一的规范
  • 使用接口也会支有规范更好的代码提示
  • 抽象类不仅可以定义规范,还可以写业务代码,而接口只有规范

抽象类

下面是抽象类与接口的结合使用

interface AnimationInterface {
    name: string
    age?: number
    play(): void
}

abstract class Animations {
    public eat(): void {
        console.log(`吃什么`);
    }
}

class Cat extends Animations implements AnimationInterface {
    public name: string = '猫咪'
    public play(): void {
        console.log(`${this.name}爬树`);
    }
}

class Dog extends Animations implements AnimationInterface {
    public name: string = '狗子'
    public play(): void {
        console.log(`${this.name}捉老鼠`);
    }
}
const cat = new Cat()
const dog = new Dog()
cat.eat()
cat.play()
dog.play()

对象

interface UserInterface {
    name: string
    age: number
    getInfo(other: string): void
}

const hj: UserInterface = {
    name: 'hj',
    age: 18,
    getInfo: function (other: string) {
        console.log(`${this.name} ${this.age}, ${other}`);
        
    }
}
console.log(hj); // { name: 'hj', age: 18, getInfo: [Function: getInfo] }
console.log(hj.getInfo('吃喝玩乐买买买')); // hj 18, 吃喝玩乐买买买

如果尝试添加一个接口中不存在的函数将报错,移除接口的属性也将报错

...
const hj: UserInterface = {
    name: 'hj',
    age: 18,
    getInfo: function (other: string) {
        console.log(`${this.name} ${this.age}, ${other}`);
        
    },
    sex: '男' // “sex”不在类型“UserInterface”中
}

如果有额外的属性,使用以下方式声明,这样就可以添加任意属性了

interface UserInterface {
    name: string
    age: number
    getInfo(other: string): void
    [key: string]: any
}

接口继承

  • 接口可以使用 extends 来继承
interface AnimationInterface {
    name: string
    play(): void
}

interface BiologyInterface extends AnimationInterface {
    age: number
}

class Cat implements BiologyInterface {
    public name: string = '猫咪'
    public age: number = 2
    public play(): void {
        console.log(`${this.name}爬树,它${this.age}岁了`);
    }
}

const cat = new Cat()
cat.play()

  • 对象可以使用实现多个接口,多个接口用逗号连接
interface AnimationInterface {
    name: string
    play(): void
}

interface BiologyInterface {
    age: number
}

class Cat implements AnimationInterface, BiologyInterface {
    public name: string = '猫咪'
    public age: number = 2
    public play(): void {
        console.log(`${this.name}爬树,它${this.age}岁了`);
    }
}

const cat = new Cat()
cat.play()

函数

使用接口约束函数的参数与返回值

  • 会根据接口规范提示代码提示
  • 严格约束参数类型,维护代码安全

函数参数

下面是对函数参数的类型约束

interface UserInterface {
    name: string
    age: number
    [key: string]: any
}

const hj = (info: UserInterface): UserInterface => {
    console.log(`${info.name}已经${info.age}岁了`);
    info.sex = 'name'
    return info
}
const user: UserInterface = {
    name: 'hj',
    age: 18,
}
console.log(hj(user)); // { name: 'hj', age: 18, sex: 'name' }

函数声明

使用接口可以约束函数的定义

interface payFunc {
    (price: number): string
}

const pay: payFunc = (price: number) => `支付${price}`
console.log(pay(100)); // 支付100元

构造函数

使用 interface 可以优化代码,同时也具有良好的代码提示

interface UserInterface {
    name: string
    age: number
}

class User {
    info: UserInterface
    constructor(user: UserInterface) {
        this.info = user
    }
}

const hj = new User({ name: 'hj', age: 19 })
console.log(hj); // User { info: { name: 'hj', age: 19 } }

数组

对数组类型使用接口进行约束

interface UserInterface {
    name: string
    age: number
}

const hj: UserInterface = {
    name: 'hj',
    age: 18
}

const hk: UserInterface = {
    name: 'hk',
    age: 20
}

const userList: UserInterface[] = [hj, hk] 
console.log(userList); // [ { name: 'hj', age: 18 }, { name: 'hk', age: 20 } ]

枚举

下面是使用枚举设置性别

enum SexType {
    BOY,
    GIRL
}

interface UserInterface {
    name: string,
    sex: SexType
}

const hj: UserInterface = {
    name: 'hj',
    sex: SexType.BOY
}
console.log(hj); // { name: 'hj', sex: 0 }

type

type 与 interface 非常相似都可以描述一个对象或者函数,使用 type 用于定义类型的别名,是非常灵活的类型定义方式。

  • type 可以定义基本类型别名如联合类型,元组
  • type 与 interface 都是可以进行扩展
  • 使用 type 相比 interface 更灵活
  • 如果你熟悉其他编程语言,使用 interface 会让你更亲切
  • 使用类(class) 时建议使用接口,这可以与其他编程语言保持统一
  • 决定使用哪个方式声明类型,最终还是看公司团队的规范

基本使用

下面是使用 type 声明对象类型

type User = {
    name: string
    age: number
}

const hj: User = {
    name: 'hj',
    age: 20
}

上面已经讲解了使用 interface 声明函数,下面来看使用 type 声明函数 的方式

type payFunc = (price: number) => string
const pay: payFunc = (price: number) => `支付${price}`

console.log(pay(100)); // 支付100元

类型别名

type 可以为 number、string、boolean、object 等基本类型定义别名,比如下例的 IsBoss。

// 基本类型别名
type IsAdmin = boolean

// 定义联合类型
type Sex = 'boy' | 'girl'

type User = {
    isAdmin: IsAdmin,
    sex: Sex
}

const hj: User = {
    isAdmin: true,
    sex: 'boy',
}

// 声明元组
const userList: [User] = [hj]

索引签名

type 与 interface 在索引签名上的声明是相同的

interface User {
    [key: string]: any
}

type UserTYpe = {
    [key: string]: any
}

声明继承

interface

  • typescript 会将同名接口声明进行合并
interface User {
    name: string
}
interface User {
    age: number
}

const hj: User = {
    name: 'hj',
    age: 20
}

  • interface 也可以使用 extends 继承
interface User {
    name: string
}
interface Person extends User {
    age: number
}

const hj: Person = {
    name: 'hj',
    age: 20
}

  • interface 也可以 extends 继承 type
type User = {
    name: string
}
interface Person extends User {
    age: number
}

const hj: Person = {
    name: 'hj',
    age: 20
}

type

  • type 与 interface 不同,存在同名的 type 时将是不允许的
type User = {
    name: string
}

// 标识符“User”重复
type User = {
    age: number
}

  • Type 可以使用 & 将 type 与 interface 或 type 进行合并
type User = {
    name: string
}
type Something = {
    height: number
}

interface PersoInterface {
    age: number
}
interface OtherInterface {
    sex: number
}

type Info = User & PersoInterface
type InfoInfo = PersoInterface & OtherInterface
type UserSomething = User & Something

const hj: Info = {
    name: 'hj',
    age: 19
}

  • 使用 | 声明满足任何一个 type 声明即可
type User = {
    name: string
}
type Person = {
    age: number
}
type Member = User | Person

const hj: Member = {
    age: 19
}

implements

class 可以使用 implements 来实现 type 或 interface

type User = {
    name: string
}

class Person implements User {
    name: string
}


第五章:泛型 Generics

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: TypeScript 接口是一种用于描述对象形状的语法结构,它可以定义对象的属性、方法、函数等,以及它们的类型和参数。接口可以用来约束函数的输入和输出,也可以用来定义类的成员。接口可以被继承和实现,从而实现代码的复用和灵活性。在 TypeScript 中,接口是一种非常重要的语言特性,它可以帮助我们更好地组织和管理代码。 ### 回答2: TypeScript中的接口interface)是用于定义对象的结构和类型的一种语法。接口可以用来描述一个对象应该具有的属性和方法,相当于定义了一个规范。 在TypeScript中,通过interface关键字来声明一个接口接口可以包含属性、函数、索引器和其他接口等。例如: ```typescript interface Person { name: string; age: number; sayHello(): void; } const person: Person = { name: "Alice", age: 20, sayHello() { console.log("Hello!"); } }; person.sayHello(); // 输出"Hello!" ``` 上述代码中,我们定义了一个名为Person的接口,它包含了name属性(类型为string)、age属性(类型为number)和sayHello方法(没有返回值)。然后,我们创建了一个符合Person接口规范的对象,并调用了sayHello方法。 接口的好处在于它可以提供类型检查,确保我们使用的对象符合接口的定义。如果一个对象不满足接口的要求,TypeScript会在编译时报错。这样可以在开发过程中避免一些常见的错误。 接口还可以用来描述函数类型、类类型等。它可以作为类型注解使用,对函数的输入参数和返回值进行约束,或者用于定义类的实例部分和静态部分的类型。 总而言之,TypeScript接口是一种强大的工具,它可以帮助我们在开发过程中更好地定义和约束对象的结构和类型,提高了代码的可读性和可维护性。 ### 回答3: TypeScript中的接口interface)是用来定义对象的结构和类型的。接口可以定义对象的属性、方法和可选属性等。 通过接口的方式可以明确定义一个对象应该具有的属性和方法,以及它们的类型。一旦定义了接口,就可以使用它来强制对象符合这个接口定义的结构。 接口的定义与类的定义有些类似,但是接口是一种抽象的概念,不能直接被实例化。它可以被类、对象、函数等来实现或者继承。当一个类实现了一个接口时,它必须实现接口中定义的所有属性和方法。 使用接口可以有效地帮助我们进行代码的重用和维护。当一个对象需要满足多个接口时,可以使用逗号将多个接口名进行分隔,在该对象中实现这些接口定义的属性和方法。 同时,接口还可以用来定义函数的参数类型和返回值类型。通过指定函数参数和返回值的接口定义,可以限制函数的使用范围,并提供更明确的类型检查。 总结起来,TypeScript中的接口是用来定义对象结构和类型的一种机制。它可以帮助我们明确对象的属性和方法,并提供类型检查。使用接口可以增加代码的可读性、可维护性,并提高代码的重用性和健壮性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

__畫戟__

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

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

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

打赏作者

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

抵扣说明:

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

余额充值