TypeScript定义接口(interface)案例教程

接口的作用:

接口,英文:interface,其作用可以简单的理解为:为我们的代码提供一种约定。

在Typescript中是这么描述的:

  • TypeScript的核心原则之一是对值所具有的结构进行类型检查。它有时被称做“鸭式辨型法”或“结构性子类型化”。
  • 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。

举个例子:

// 定义接口 Person
interface Person {
    name: string;
    age: number;
}

// 指定定义的变量 man 的类型为我们的 Person "类型" 【这么表达不是很准确,只是为了方便理解】
let man: Person;

// 此时,我们对 man 赋值时,man 就必须遵守我们定义的 Person 约束,即必须存在 number 类型的 age 字段 和 string 类型的 name 字段
man = { age: 10, name: 'syw' }
# 或者这样
function fun(women:Person){} // 参数 womem 也必须遵守 Person 约束

上面的例子我简单说了一下如何定义一个接口和接口的作用,下面我就简单的说一下接口的其他玩法:

设置接口可选属性:

带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个 ? 符号。

interface Person {
    name: string
    age?: number
}

可选属性,我们最常见的使用情况是,不确定这个参数是否会传,或者存在。

在Typescript中是这么描述可选参数的好处的:

  • 可选属性的好处之一是可以对可能存在的属性进行预定义,好处之二是可以捕获引用了不存在的属性时的错误。

额外属性检查:

说起来这一点,简单总结一下就是:我们可以设置属性是可选的,但是不能传错误的属性。

  • 以上面的 Person 接口为例,如果我们使用时把 age 属性 错误写成了 aag,typescript 会报错,即使 age 属性本身不是必须传的。

这就是额外属性检查。

当然,我们也可以使用 类型断言 绕开这些属性检查,上链接:TypeScript中的类型断言[as语法 | <> 语法]

设置接口只读属性:

一些对象属性只能在对象刚刚创建的时候修改其值。 所以我们可以在属性名前用 readonly来指定只读属性 。

interface Person {
    readonly name: string;
    readonly age: number;
}
// 赋初始值
let man: Person = {name: 'syw', age: 10};

// 如果此时在对值进行修改,就会出错。
man.age = 20;// error!
// Cannot assign to 'age' because it is a read-only property.

说起来,只读属性使用起来的效果和 const 差不多,当然两者根本不是一个东西,我这么说只是为了好理解。

在Typescript中是这么描述 readonly 和 const 的:

  • 最简单判断该用readonly还是const的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用 const,若做为属性则使用readonly。

函数类型接口:

简单来说,函数类型的接口就是规定了 函数的参数类型以及函数的返回值类型。

interface PersonFun {
    (name: string, age: number): boolean
}
// 定义函数,符合 PersonFun 约束
let manFun: PersonFun = (name: string, age: number) => {
    return age > 10;
}

注意:

  1. 函数参数类型不可更改,包括返回值也必须遵守约束。
  2. 函数参数名可以不用和接口中的名字对应,只要求对应参数位置的类型兼容。
// 这样也是符合要求的
let manFun: PersonFun = (name12: string, age12: number) => {
    return age > 10;
}

可索引类型接口:

可索引类型接口简单来说就是,我们可以规定 索引的类型 和 返回值的类型。

  • 例如:数组中,我们可以规定 以 number 类型的值来索引,索引到的是一个 string 类型的值,这样的话其实这个数组的形式基本就固定了。
interface PersonArr {
    [index: number]: string
}
// 定义数组
let manArr: PersonArr = ['syw','syw1','syw2'];
// 查询
manArr[0]; // 此时 0 作为索引是 number 类型,0 号元素返回的是 syw 是 string 类型

Typescript 中支持两种索引签名,其实就是索引类型,分别是:number 和 string。

并且,如果我们使用 number 类型的索引,那么定义的返回值类型 必须是 定义 string 类型索引返回值的子类型。

Typescript 是这么解释这句话的:

  • 当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。也就是说用 100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致。

我一开始看到这句话的时候,文字意思看懂了,但是不知道怎么去简单的表述这句话,仔细研究了一下才知道【可能是我太菜】,其实很简单:

// 比如我这个 PersonArr 有两个索引,一个是 index(number)类型,一个是 item(string) 类型,那么我在定义这个两个索引的返回值的时候,就必须严格遵守上面说的:
// 使用 number 类型的索引,那么定义的返回值类型 必须是 定义 string 类型索引返回值的子类型。

// 所以我下面定义的这个接口就会报错
interface PersonArr {
    [index: number]: string;
    [item: string]: number;
}
// 因为 index 返回值是 string 类型 ,很显然不是 item 返回值 number 类型的子类型
// 怎么写才对呢?最简单的方法,把 index 返回值的类型也改成 number 就好了。

到此这篇关于TypeScript定义接口(interface)案例教程的文章就介绍到这了,更多相关TypeScript定义接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一文了解TypeScript数据类型

    目录 基础类型 any类型 数组 元组 Interface 函数 类型自推 联合类型(二选一甚至多选一) class 枚举 基础类型 ts中支持更多的类型 let age: number = 10 // Number let firstName: string = '凉宸' // String let lastName: string = '凉宸' // String let isMary: boolean = true // boolean let unde: undefined = unde

  • 深入理解typescript中的infer关键字的使用

    infer 这个关键字,整理记录一下,避免后面忘记了.有点难以理解呢. infer infer是在 typescript 2.8中新增的关键字. infer 可以在 extends 条件类型的字句中,在真实分支中引用此推断类型变量,推断待推断的类型. 例如:用infer推断函数的返回值类型 type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; type fn = () => number type

  • 为什么TypeScript的Enum会出现问题

    目录 发生了什么呢? 什么时候用 控制枚举的数字 Bit值 控制索引 非数字枚举 结论 TypeScript引入了很多静态编译语言的特性,比如class(现在是JavaScript的一部分了),interface, generics和union types等. 但是今天有一个类型需要着重讨论下,这就是enum. 对于很多的静态语言来说,枚举是一个很非常常见的语言特性.比如,c,c#,java和swift.枚举就是你在代码里可以用的一组常量. 我们用TypeScript来新建一个enum来代表一周

  • Typescript中的as、问号与感叹号详解

    1.as关键字表示断言 在Typescript中,表示断言有两种方式.一种是扩号表示法: let someValue: any = "this is a string"; let strLength: number = (someValue).length; 另一种使用as关键字: let someValue: any = "this is a string"; let strLength: number = (someValue as string).length

  • TypeScript的函数定义与使用案例教程

    TypeScript中函数的定义和使用 1. 声明一个函数约束其传参类型,以及返回值类型 传入两个参数,没有返回值 const fun1 = (key: string, value: number): void => { console.log(key, value);//"Typescript",100 }; fun1("Typescript", 100); 2.TypeScript中的函数配置可选参数,在ES5或者ES6中函数中的实参可以不传递进去,但是在

  • 一文搞懂TypeScript的安装、使用、自动编译的教程

    1. 初识 TypeScript 上篇文章给大家介绍过TypeScript的安装.使用.自动编译的实现  需要的朋友点击查看. TypeScript 的介绍 TypeScript 是一种由微软开发的开源.跨平台的编程语言.它是 JavaScript 的超集,最终会被编译为 JavaScript 代码. 2012 年 10 月,微软发布了首个公开版本的 TypeScript,2013 年 6 月 19 日,在经历了一个预览版之后微软正式发布了正式版 TypeScript TypeScript 的作

  • 教你使用webpack打包编译TypeScript代码

    TypeScript打包 webpack整合 通常情况下,实际开发中我们都需要使用构建工具对代码进行打包: TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS: 步骤如下: 初始化项目 进入项目根目录,执行命令 npm init -y,创建package.json文件 下载构建工具 命令如下: npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpac

  • React+TypeScript进行项目构建案例讲解

        react项目构建可以很简单,但是如果是结合typescript,其实也不是很麻烦,官网也有很明确的说明.有两种办法:     1.直接构建带有typescript的react项目,我们需要增加额外的参数,模版不能使用默认的cra-template.而是使用cra-template-typescript. npx create-react-app tsreactdemo --template typescript           创建完成的成功提示与原来没有太大的区别,直接进入项目路

  • TypeScript定义接口(interface)案例教程

    接口的作用: 接口,英文:interface,其作用可以简单的理解为:为我们的代码提供一种约定. 在Typescript中是这么描述的: TypeScript的核心原则之一是对值所具有的结构进行类型检查.它有时被称做"鸭式辨型法"或"结构性子类型化". 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. 举个例子: // 定义接口 Person interface Person { name: string; age: numb

  • kotlin 定义接口并实现回调的例子

    开发环境 android studio 3.0.1 已支持 kotlin 1.定义接口 interface CallBack{ fun callBack(info : String) } 2.实现接口 : 为继承\实现 class CallBacks : CallBack{ override fun callBack(info : String){ Log.d("MainApp","current info $info") } } 或者 private var mC

  • typeScript 核心基础之接口interface

    目录 1.接口定义 2.接口继承 3.类实现接口 前言: 在面向对象语言中,接口是一个很重要的概念,它是对行为的抽象.接口也叫 interface . 在 js 中没有接口这个概念,它是新增的.该如何定义呢?下面来一起学习吧 1.接口定义 接口的作用: 在面向对象编程中,接口是一种规范的定义,它定义了行为和动作规范: 在程序设计内,接口起到一种限制和规范的作用: 接口一般使用 interface 关键字来定义,名字首字母需要大写.在项目中定义接口的时候,一般在名字前加一个大写 I 字母,能够快速

  • React中常见的TypeScript定义实战教程

    目录 一 引沿 二 什么是调和 三 什么是Filber 四 实现调和的过程 五 总结 一 引沿 Fiber 架构是React16中引入的新概念,目的就是解决大型 React 应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是React的虚拟DOM,更新Fiber的过程叫做调和,每一个fiber都可以作为一个执行单元来处理,所以每一个 fiber 可以根据自身的过期时间expirationTime,来判断是否还有空间时间执行更新,如

  • MyBatis延迟加载与立即加载案例教程

    MyBatis入门-延迟加载与立即加载 加载策略 延迟加载 延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询. 需要在主配置文件开启加载策略,子配置文件使用collection属性 立即加载 所谓立即加载就是查询时,所有的相关数据一次被读取出来,而不是分N次. 一对

  • JavaScript设计模式--简单工厂模式定义与应用案例详解

    本文实例讲述了JavaScript设计模式--简单工厂模式定义与应用.分享给大家供大家参考,具体如下: 一,介绍 工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类. 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口方法以便创建的时候指定自己的对象类型. 在这里将工厂简单分为三种: (1)简单工厂:通过第三方的类完成松耦合的任务. (2)复杂工厂:通过把实例化的任务交给子类来完成的,用以到达松耦合的目的. (

  • Java深入解析接口interface

    目录 1.接口定义 示例 2.接口细节01 示例 3.接口细节02 4.接口细节03 5.接口多态特性 1.接口定义 基本介绍 接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些 方法写出来. 语法 interface 接口名{//属性1方法}接口 •class 类名 implements 接口{自己属性:自己方法:必须实现的接口的抽象方法} 示例 inerface01.java package com.demo.Interface_; public clas

  • vite + react +typescript 环境搭建小白入门教程

    目录 前言 1. 使用 vite 创建 react 项目 1. npm / yarn 命令初始化 2. 输入项目名称 3. 选择框架 4. 选择 Js / Ts 5. 项目创建完成 6. 启动项目 2. 规范项目目录 3. 使用 react-router-dom 路由 1. 使用 npm / yarn 命令下载 2. 更改 react-router-dom 版本 3. 修改App.tsx文件 4. 配置 alias 别名 5. 配置 Ant Design 样式库 6. 配置axios与顶部加载进

  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struct类型理解为类,可以定义方法,和函数定义有些许区别: struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User) struct使用 下面示例中user1和

随机推荐