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

全部留言(25)

  • 最新
  • 精选
周贺
课程中有一句结论:父类和子类的实例是可以完全兼容的。 这个结论不严谨,可以在子类中增加一个属性调试下。课程中的子类没有新的属性,所以得出上面的结论。如果子类中增加了新的属性,结论可能有点小问题。。

作者回复: 其实前面提到了,这个结论需要一个前提,就是实例要具有相同的成员,也就是要比较结构。子类加了一个属性,结构就不一致了,自然不兼容。

2019-08-03
2
量子蔷薇
x=y y=x 第一步的时候x和y已经相等了,为什么第二步会出错,第二步x已经有属性c了啊

作者回复: x、y的类型是没有变的,接口 X 还是缺少 c 属性,这里编译器检查的是类型。

2020-05-20
1
非常菜加一
f 和 g 返回的类型的“父子”关系不对吧?子类型(f)反而成员比父类型(g)少?还是说这里概念上与类的“父子”关系不一样?

作者回复: 这里说的父子类型不是类中的父子关系,你可以理解为子集关系

2020-02-02
1
野原
老师,我没有关闭strictFunctionTypes,b=a和b=c 也不报错啊!

作者回复: vscode 有时候是会出现这样的问题,我也遇到过,重启一下就正常了

2019-08-19
3
1
Ran
我这边测试的结果是,函数兼容的时候,strictNullChecks 设为 false 且 strictFunctionTypes 继续被注释的前提下,a(固定参数函数)、b(可选参数函数)和 c(剩余参数函数)是可以互相赋值的。 这个效果和 将 strictFunctionTypes 设为 false,从结局上看是一致的,这个是为啥

作者回复: strictNullChecks是检查参数个数的,strictFunctionTypes是检查参数类型的, 如果你按照课程的例子,strictFunctionTypes的设置不会影响函数a、b、c的相互赋值

2021-04-08
Geek_d64504
我用的vscode编辑器,不会向右推断,提示是any类型;window.onkeydown = (event) => { console.log(event); };这是为什么

作者回复: 目前看 Contextual Typing 失效了,暂未查到原因,建议显示指定一下 event 类型吧

2021-04-07
逃之玉諑
用的webstrom. //函数兼容性 type Handler = (a:number, b:number) => void; function hof(handler:Handler) { return handler; } 这段函数报错:Error:(51, 14) TS1250: Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'. IDE提示我可以改成: const hof = (handler:Handler) => handler; 这是为什么呢

作者回复: 严格模式下,function只能位于模块顶级,不可嵌套

2020-05-24
赵嘚住
老师,针对我上面的那个问题这,怕你看不到,再次复制一遍 没有任何地方在次赋值了,只有一个地方执行了clearTimeout。第一次启动devServer的时候没有问题,只要改动一下,hot加载就会出现问题。具体的代码我放在github上,老师您帮我看一下好吗,https://github.com/zhaodeezhu/cover-hooks 老师你好,使用 react hook + ts 使用setTimeout遇见了一个问题,编译的时候会报错 代码: /** 记录自动关闭的定时器 */ const closeTimeout = useRef<NodeJS.Timeout>() /** 设置定时关闭的时间 */ useEffect(() => { if(props.closeTime && visible === true) { const id = setTimeout(() => { close() }, props.closeTime) console.log(typeof id) closeTimeout.current = id; } return () => { if(closeTimeout.current) { clearTimeout(closeTimeout.current) } } }, [visible]) 报错: TS2322: Type 'number' is not assignable to type 'Timeout | undefined'. 但是如果我const closeTimeout = useRef<number>()这样的话也会报错 Type 'Timeout' is not assignable to type 'number' 这个类型的问题怎么解决呢

作者回复: 你好,又整体看了一下代码,报错原因找到了:lib.dom.d.ts中的setTimeout和globals.d.ts中的setTimeout冲突了,它们的返回值类型一个是number,一个是NodeJS.Timeout。 方案一: const closeTimeout = useRef<number>() const id = window.setTimeout(...) 方案二: const closeTimeout = useRef<NodeJS.Timeout>() const id = global.setTimeout(...)

2020-04-22
赵嘚住
老师你好,使用 react hook + ts 使用setTimeout遇见了一个问题,编译的时候会报错 代码: /** 记录自动关闭的定时器 */ const closeTimeout = useRef<NodeJS.Timeout>() /** 设置定时关闭的时间 */ useEffect(() => { if(props.closeTime && visible === true) { const id = setTimeout(() => { close() }, props.closeTime) console.log(typeof id) closeTimeout.current = id; } return () => { if(closeTimeout.current) { clearTimeout(closeTimeout.current) } } }, [visible]) 报错: TS2322: Type 'number' is not assignable to type 'Timeout | undefined'. 但是如果我const closeTimeout = useRef<number>()这样的话也会报错 Type 'Timeout' is not assignable to type 'number' 这个类型的问题怎么解决呢

作者回复: 你提供的这段代码,在我这里并没有报错,useRef 返回的类型是{ current: T | undefined },你传入了NodeJS.Timeout,那么 current 的类型就是 Timeout | undefined,是不是在其他地方给 current 赋值了 number?

2020-04-22
2
Geek_7c4953
c为什么不兼容b?调用b会传0、1、2个number,这不是都满足c的定义吗? 为什么这里讲兼容性的时候要把strictFunctionTypes关掉?关掉还讲什么兼容不兼容啊,干脆都any好了...

作者回复: 1)当 strictNullChecks: true 时, b = c //不兼容 原因:b的参数可能有两个,比如b(1,2);c的参数可能有3个,比如c(1, 2, 3)。这样在赋值第三个参数时就出现了将 undefined 分配给 number 的情况。 而当 strictNullChecks: false 时,TS 允许将 undefined类型 分配给 number类型, b = c //兼容 2)关闭某些严格严查是为了兼容现存的老系统,不至于有很多报错,影响开发体验。新系统完全可采用严格模式。

2020-03-15
4
收起评论