TypeScript 开发实战
梁宵
搜狗营销事业部高级架构师
34174 人已学习
新⼈⾸单¥59
课程目录
已完结/共 47 讲
TypeScript 开发实战
登录|注册
留言
8
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 18 | 高级类型(1):交叉类型与联合类型
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 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(8)

  • 最新
  • 精选
AIGC Weekly 周报
您好,老师,你对一个同学的评论是:继承可以有自己的属性,交叉不可以。如何理解呢?我想的交叉继承是如下代码这样,但是这种方式并不行。 class Dog {} class Cat {} // 会报错 class Animal extends Dog & Cat {}

作者回复: 交叉类型表示一种类型(取所有属性的并集,如果需要新增属性则需要再交叉一个类型);而继承则是表示一种值(子类继承父类的属性,也可以任意定义自己的属性),本质上是不同的。如果想实现你代码的效果,可以这样: class Dog {} class Cat {} type DogCat = Dog & Cat class Animal implements DogCat{}

2020-03-20
4
+*
老师您好。对于交叉类型有一点疑问,如果两个类型定义了同一个方法,那么在交叉类型中要如何写呢? interface DogType { run(): void eat(x: number): number } interface CatType { jump(): void eat(y: string, z: string): string } let pet: DogType & CatType = { run() {}, jump() {}, // eat(x: number): number; // eat(y: string, z: string): string; // eat(y: string | number, z?: string): string // 以上三种好像都不对。eat 应该怎么写呢? }

作者回复: 这个问题比较有趣。接口的属性分两种,如果是基本类型,比如: interface A { a: number } interface B { a: string } let foo: A & B = { a: } 你会发现对象 foo 的属性 a 的类型应该是 never,即 number & string 的类型。但 TS 规定没有任何值可以赋值给 never 类型,所以无论怎么赋值都会失败。 如果属性是函数,情况略有不同: interface A { f(a: number): number } interface B { f(a: string, b: string): string } let foo: A & B = { f(a: never) { return a } } 在交叉类型中,发生了函数重载,foo中的具体实现应该是一个宽泛的版本,同时兼容A和B中的定义:参数个数上,要选择最少的,参数类型和返回值类型参考前面的例子,取 number & string,即 never。这样不会报错。 实际上应该避免这种情况发生,仅做实验探讨吧。

2020-03-26
3
3
Hurry
交叉类型和类型之间继承,是不是效果是一样的

作者回复: 继承可以有自己的属性,交叉不可以。

2019-08-01
1
~鸵鸟蛋~
function area(s: Shape): number { switch(s.kind) { case 'square': return s.size * s.size case 'rectangle': return s.height * s.width } } 老师,我指定了返回值类型之后还是没有错误提示啊

作者回复: 增加Circle类型了吗? type Shape = Square | Rectangle | Circle; 如果增加了,但没有计算面积的逻辑是会报错的。

2019-12-29
3
陆 慢 慢
只能访问交集貌似说的不够严谨,通过类型保护 instanceof 判断后还是可以访问的 function getPet(master: Master) { let pet = Master.Boy ? new Dog() : new Cat() if (pet instanceof Dog) pet.run() else pet.jump() pet.eat() return pet }

作者回复: 在类型未确定的情况下,只能访问共有成员,instanceof 已经确定了类型。

2019-12-23
2
Geek_niu
谁能告诉我 为什么搞这么复杂呢,使用场景多吗
2023-05-18
递归涛
这节课和之前的类型保护好像也差不太多啊
2019-11-21
乃乎
这个 default 好
2019-11-17
收起评论