作者回复: type和interface 多数情况下有相同的功能,就是定义类型。但有一些小区别: type:不是创建新的类型,只是为一个给定的类型起一个名字。type还可以进行联合、交叉等操作,引用起来更简洁。 interface:创建新的类型,接口之间还可以继承、声明合并。 如果可能,建议优先使用 interface。 混合接口一般是为第三方类库写声明文件时会用到,很多类库名称可以直接当函数调用,也可以有些属性和方法。例子你可以看一下@types/jest/index.d.ts 里面有一些混合接口。 用混合接口声明函数和用接口声明类的区别是,接口不能声明类的构造函数(既不带名称的函数),但混合接口可以,其他都一样。
作者回复: TS 在定义一个变量时就会进行类型检查, let lib: Lib = () => {} 这一步就已经报错了, 后续再加属性也是无效的,所以只能用类型断言。
作者回复: 是的,接口名称就是这个函数类型的名称
作者回复: 报错因为ObjINFO1 和ObjINFO2、ObjINFO3 类型不兼容,前者成员不固定,后者两者固定。我想到一个方法: type ObjINF1 = Partial<ObjINF2 & ObjINF3> 看看能否解决你的问题
作者回复: 总体来讲是函数兼容性问题,参数多的兼容参数少的,所以类型Add兼容第一个函数,不兼容第三个,第二个函数报错是因为返回值类型不兼容。 第二个问题是因为你显示地声明了add的类型是Add,所以调用时会按照这个类型检查。 请参看第16讲。
作者回复: 这里的含义是,如果不封装一下 lib,它就是一个全局变量,封装后就可以通过闭包创建多个 lib。虽然与纯oop中单例的实现有些区别,但思想是一致的。
作者回复: 因为这样定义的lib 还缺少version 和 doSomething 属性