TypeScript 开发实战
梁宵
搜狗营销事业部高级架构师
34174 人已学习
新⼈⾸单¥59
课程目录
已完结/共 47 讲
TypeScript 开发实战
登录|注册
留言
9
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 08 | 接口(2):函数类型接口
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 重塑“类型思维”
02 | 类型基础(1):强类型与弱类型
03 | 类型基础(2):动态类型与静态类型
04 | 编写你的第一个TypeScript程序
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到Babel
30 | 代码检查工具:从TSLint到ESLint
31 | 使用Jest进行单元测试
32 | 创建项目
33 | 组件与类型(1):函数组件与类组件
34 | 组件与类型(2):高阶组件与Hooks
35 | 事件处理与数据请求
36 | 列表渲染与路由
37 | Redux与类型
38 | 搭建服务端开发环境
39 | 列表的CRUD
40 | 导出Excel
41 | 搭建Vue开发环境
42 | 组件封装
43 | 组件发布
44 | 共存策略
45 | 宽松策略
46 | 严格策略
47 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(9)

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

作者回复: type和interface 多数情况下有相同的功能,就是定义类型。但有一些小区别: type:不是创建新的类型,只是为一个给定的类型起一个名字。type还可以进行联合、交叉等操作,引用起来更简洁。 interface:创建新的类型,接口之间还可以继承、声明合并。 如果可能,建议优先使用 interface。 混合接口一般是为第三方类库写声明文件时会用到,很多类库名称可以直接当函数调用,也可以有些属性和方法。例子你可以看一下@types/jest/index.d.ts 里面有一些混合接口。 用混合接口声明函数和用接口声明类的区别是,接口不能声明类的构造函数(既不带名称的函数),但混合接口可以,其他都一样。

2019-08-15
16
msupercoder
为什么lib加了 version doSomething 属性后编译器还是会报错误呢?

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

2019-07-23
2
6
用接口定义函数 ,必须有个匿名函数, 这个匿名函数就是接口定义的函数?

作者回复: 是的,接口名称就是这个函数类型的名称

2020-06-12
1
欧罗巴皇
interface ObjINF1 { [key: string]: string | number | undefined; } interface ObjINF2 { id: number; title: string; } interface ObjINF3 { parentId: number; name: string; desc: string } function a1(objArr: ObjINF1[]) { } function a2(objArr: ObjINF2[]) { a1(objArr) } function a3(objArr: ObjINF3[]) { a1(objArr) } 老师这样为什么报错?而且需要怎么处理才行啊!

作者回复: 报错因为ObjINFO1 和ObjINFO2、ObjINFO3 类型不兼容,前者成员不固定,后者两者固定。我想到一个方法: type ObjINF1 = Partial<ObjINF2 & ObjINF3> 看看能否解决你的问题

2019-12-30
3
1
Dean
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-23
1
鲜于伯德
之前做过单例类的简单封装,所以不太明白这里lib为什么是一个单例?老师能简单说一下吗?

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

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

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

2019-09-23
麦晓杰alwaysu
#### 声明函数的方式: 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(); ```
2019-07-22
10
小七七
这一节后面的混合接口比较粗糙,
2022-04-20
1
收起评论