You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// interface extends interfaceinterfacePointX{x: number}interfacePointextendsPointX{y: number}// type alias extends type aliastypePointX={x: number}typePoint=PointX&{y: number}// interface extends type aliastypePointX={x: number}interfacePointextendsPointX{y: number}// Error: interface 无法继承联合类型typePointX={x: number}|{y: number }interfacePointextendsPointX{y: number}// type alias extends interfaceinterfacePointX{x: number}typePoint=PointX&{y: number}
上面的代码编译阶段不报错,但在运行时会报错,但是为什么 TS 类型检测没有报错呢?默认这种情况下 TypeScript 不会缩小块作用域中的类型,此时 TypeScript 认为 foo 为 any 类型,所以 foo.toSome(2) 不会出现编译错误,但 foo.toSome() 方法确实不存在,所以会出现运行时错误。那么如何避免这种情况发生呢?—— 使用 is 关键字,具体示例如下:
functionisString(val: any): val is string{returntypeofval==='string'}functionexample(foo: any){if(isString(foo)){console.log('it is a string'+foo)console.log(foo.length)console.log(foo.toSome(2))// 编译时报错,运行时报错}}
使用 val is string 函数返回类型,而不是将 boolean 用为函数返回类型。因为在调用 isString() 之后,如果函数返回 true,TypeScript 会将类型范围缩小为 string,在编译时就能发现代码错误。
is 关键字可以有效的缩小类型范围,可以帮助我们在编辑阶段发现错误,从而避免一些隐藏的运行时错误,这也是 TypeScript 的优势所在。
interfaceIPerson{age: numbername: stringweight: string}constgauseen: IPerson={age: 26,name: 'gauseen',weight: '65kg',}// ErrorObject.keys(gauseen).map((key)=>gauseen[key])// Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'IPerson'.// No index signature with a parameter of type 'string' was found on type 'IPerson'.(7053)
盘点 TypeScript 中的易混淆点
any VS unknown VS void VS never
any
any
用来表示可以赋值为任意类型,包括any
类型值的属性和方法,所有类型都能被赋值给它,它也能被赋值给其他任何类型,在 TypeScript 中尽量避免使用unknown
unknown
是any
类型对应的安全类型,在对unknown
类型的值执行大多数操作之前,我们必须进行某种形式的检查。而在对any
类型的值执行操作之前,我们不必进行任何检查对
unknown
类型大多数操作都认为是错误的所以在操作
unknown
类型前,应该缩小类型范围,可以通过:typeof、instanceof、as、is
void
void
表示没有任何类型,只能将它赋值为undefined
和null
never
never
表示永远不存在的值的类型,never
类型只能赋值给另外一个never
当一个函数没有返回值时,它返回了一个
void
类型,但是,当一个函数根本就没有返回值时(陷入死循环或者总是抛出错误),它返回一个never
。void
指可以被赋值的类型(在 strictNullChecking 为 false 时),其他任何类型不能赋值给never
,除了never
本身以外interface VS type
开发中,经常用
interface
或type
用于类型声明,对于新手来说非常容易混淆,下面梳理一下它们之间的相同点与不同点。相同点
定义对象或函数
两者都可以定义对象或者函数,但是语法有所不同,示例如下:
Extend(继承)
两者都可以
extends
(继承),但语法不同。包括,interface
可以继承type
,type
也可以继承interface
。interface
不可以继承type
的联合类型Implements(实现)
一个 class 可以实现 interface 或 type
type
的联合类型不同点
type 用于其他类型的别名
type
也可以用于其他类型,如:基本类型、联合类型、元组,但interface
不可以声明合并
一个
interface
可以定义多次,并将做为单个接口(所有声明的成员都将被合并),但type
不可以同名多次声明怎么使用?
interface
来代替type
,官方文档也有所说明interface
来定义一个类型时,选择使用type
,例如描述,基础类型的别名、联合类型、元组is VS as
is
TypeScript 中
is
关键字表示是否属于某个类型,可以有效地缩小类型范围如下代码,封装一个
isString
函数,来判断某个值是否为string
类型,函数返回值为boolean
类型。上面的代码编译阶段不报错,但在运行时会报错,但是为什么
TS
类型检测没有报错呢?默认这种情况下 TypeScript 不会缩小块作用域中的类型,此时 TypeScript 认为foo
为any
类型,所以foo.toSome(2)
不会出现编译错误,但foo.toSome()
方法确实不存在,所以会出现运行时错误。那么如何避免这种情况发生呢?—— 使用is
关键字,具体示例如下:使用
val is string
函数返回类型,而不是将boolean
用为函数返回类型。因为在调用isString()
之后,如果函数返回true
,TypeScript 会将类型范围缩小为string
,在编译时就能发现代码错误。is
关键字可以有效的缩小类型范围,可以帮助我们在编辑阶段发现错误,从而避免一些隐藏的运行时错误,这也是 TypeScript 的优势所在。as
TypeScript 允许手动覆盖它的推断,可以手动指定某个值的类型,这种机制被称为「类型断言」。
可断言的情况:
any
any
可以被断言为任何类型A
能够被断言为B
,只需要A
兼容B
或B
兼容A
即可keyof
keyof
取interface
的键,返回值可作为一个联合类型为什么第一个会报错?
因为
Object.keys()
返回string[]
,string 类型值不能作为gauseen
对象的索引,因为取值有可能会返回undefined
如何解决?
应该给
Object.keys(gauseen)
返回值做个约束/断言,让 ts 知道它的返回的值属于gauseen
对象中的某个键,如下:通过
keyof
更优雅的控制,实际效果跟上面一样参考
is
keyword do in typescript?The text was updated successfully, but these errors were encountered: