下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 08 | 接口(2):函数类型接口
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

TypeScript开发实战

共47讲 · 约450分钟
2990
免费
01 | 重塑“类型思维”
免费
02 | 类型基础(1):强类型与...
免费
03 | 类型基础(2):动态类型...
免费
04 | 编写你的第一个TypeScrip...
免费
05 | 基本类型
06 | 枚举类型
07 | 接口(1):对象类型接口
08 | 接口(2):函数类型接口
09 | 函数相关知识点梳理
10 | 类(1):继承和成员修饰...
11 | 类(2):抽象类与多态
12 | 类与接口的关系
13 | 泛型(1):泛型函数与泛...
14 | 泛型(2):泛型类与泛型...
15 | 类型检查机制(1):类型...
16 | 类型检查机制(2):类型...
17 | 类型检查机制(3):类型...
18 | 高级类型(1):交叉类型...
19 | 高级类型(2):索引类型
20 | 高级类型(3):映射类型
21 | 高级类型(4):条件类型
22 | ES6与CommonJS的模块系统
23 | 使用命名空间
24 | 理解声明合并
25 | 如何编写声明文件
26 | 配置tsconfig.json(1)...
27 | 配置tsconfig.json(2)...
28 | 配置tsconfig.json(3)...
29 | 编译工具:从ts-loader到...
30 | 代码检查工具:从TSLint到...
31 | 使用Jest进行单元测试
32 | 创建项目
33 | 组件与类型(1):函数组...
34 | 组件与类型(2):高阶组...
35 | 事件处理与数据请求
36 | 列表渲染与路由
37 | Redux与类型
38 | 搭建服务端开发环境
39 | 列表的CRUD
40 | 导出Excel
41 | 搭建Vue开发环境
42 | 组件封装
43 | 组件发布
44 | 共存策略
45 | 宽松策略
46 | 严格策略
47 | 结束语
本节摘要

精选留言(6)

  • 2019-08-15
    老师你好,请问用interface定义函数(Add)和用type定义函数(Add)有区别么?实际开发中哪个用的比较多?其次,不是很理解混合接口声明函数(Lib)的讲解。可以给一个实际的例子做参照么?直觉上Lib更像是一个对象声明,既有属性也有方法。

    作者回复: type和interface 多数情况下有相同的功能,就是定义类型。但有一些小区别:
    type:不是创建新的类型,只是为一个给定的类型起一个名字。type还可以进行联合、交叉等操作,引用起来更简洁。
    interface:创建新的类型,接口之间还可以继承、声明合并。
    如果可能,建议优先使用 interface。

    混合接口一般是为第三方类库写声明文件时会用到,很多类库名称可以直接当函数调用,也可以有些属性和方法。例子你可以看一下@types/jest/index.d.ts 里面有一些混合接口。

    用混合接口声明函数和用接口声明类的区别是,接口不能声明类的构造函数(既不带名称的函数),但混合接口可以,其他都一样。

    4
  • 2019-07-22
    #### 声明函数的方式:

    1. 通过变量声明:

    ```typescript
    let add: (x: number, y: number) => number
    ```

    2. 通过接口声明:

    ```typescript
    interface Add {
         (x: number, y: number): number
     }
    ```

    3. 通过类型别名声明:

    ```typescript
    type Add = (x:number , y: number) => number
    ```

    #### 混合接口
    声明:
    ```typescript
    interface Lib {
        (): void;
        version: string;
        doSomeThing(): void;
    }
    ```
    构造器:
    ```typescript
    function getLib() {
        let lib: Lib = (() => {}) as Lib
        lib.version = '1.0'
        lib.doSomeThing = () => {}
        return lib;
    }
    ```
    使用:

    ```typescript
    let lib1 = getLib();
    lib1();
    lib1.doSomeThing();
    let lib2 = getLib();
    ```
    展开
    2
  • 2019-07-23
    为什么lib加了 version doSomething 属性后编译器还是会报错误呢?

    作者回复: TS 在定义一个变量时就会进行类型检查,
    let lib: Lib = () => {} 这一步就已经报错了,
    后续再加属性也是无效的,所以只能用类型断言。

    1
    1
  • 2019-09-23
    请问一下老师,为什么您说 let lib: Lib = () => {} 这一步就已经报错了 ?

    作者回复: 因为这样定义的lib 还缺少version 和 doSomething 属性

  • 2019-09-23
    type Add = (a:number,b:number)=>number;
    let add :Add = (a)=>a; //通过类型检查
    let add2 :Add = (a)=>{};//类型检查报错
    let add3:Add = (a,b,c)=>a+b;//类型检查报错
    add(1) //类型检查报错
    请问老师,这里为什么函数实现的时候只传一个参数就会通过类型检查,只有在调用的时候才报错?而其他函数参数多于定义的个数或者返回值类型不对,在函数实现的时候都会类型检查报错
    展开

    作者回复: 总体来讲是函数兼容性问题,参数多的兼容参数少的,所以类型Add兼容第一个函数,不兼容第三个,第二个函数报错是因为返回值类型不兼容。

    第二个问题是因为你显示地声明了add的类型是Add,所以调用时会按照这个类型检查。

    请参看第16讲。

  • 2019-09-16
    之前做过单例类的简单封装,所以不太明白这里lib为什么是一个单例?老师能简单说一下吗?

    作者回复: 这里的含义是,如果不封装一下 lib,它就是一个全局变量,封装后就可以通过闭包创建多个 lib。虽然与纯oop中单例的实现有些区别,但思想是一致的。