作者回复: 其实前面提到了,这个结论需要一个前提,就是实例要具有相同的成员,也就是要比较结构。子类加了一个属性,结构就不一致了,自然不兼容。
作者回复: x、y的类型是没有变的,接口 X 还是缺少 c 属性,这里编译器检查的是类型。
作者回复: 这里说的父子类型不是类中的父子关系,你可以理解为子集关系
作者回复: vscode 有时候是会出现这样的问题,我也遇到过,重启一下就正常了
作者回复: strictNullChecks是检查参数个数的,strictFunctionTypes是检查参数类型的, 如果你按照课程的例子,strictFunctionTypes的设置不会影响函数a、b、c的相互赋值
作者回复: 目前看 Contextual Typing 失效了,暂未查到原因,建议显示指定一下 event 类型吧
作者回复: 严格模式下,function只能位于模块顶级,不可嵌套
作者回复: 你好,又整体看了一下代码,报错原因找到了: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(...)
作者回复: 你提供的这段代码,在我这里并没有报错,useRef 返回的类型是{ current: T | undefined },你传入了NodeJS.Timeout,那么 current 的类型就是 Timeout | undefined,是不是在其他地方给 current 赋值了 number?
作者回复: 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)关闭某些严格严查是为了兼容现存的老系统,不至于有很多报错,影响开发体验。新系统完全可采用严格模式。