五 typescript学习之路 —— ts的接口( 二 )


当然你可以使用类型断言重写arr,但是既然设置了只读,就不应该再去修改它,这里只做说明,不推荐
额外的属性检查
对于刚刚我们定义的对象不知道有没有小伙伴觉得疑惑,为什么,接口定义了几个属性,参数就传递了几个或者创建的对象就只有那么几个属性 。这里集中说明下
// 这里我们定义一个接口interface FullName {firstName: stringlastName: string}// 当我们使用接口时const fullName: FullName = { firstName: '爱新觉罗', lastName: '小胖纸', age: 22 }// error 因为FullName没有包含age属性
尴尬了,难道就只能传这两个嘛,有时候赋值一个对象,里面可多属性的怎么破
使用类型断言
我们把赋值的对象断言成符合要求的接口类型
const fullName: FullName = { firstName: '爱新觉罗', lastName: '小胖纸', age: 22 } as FullName
这样赋值的类型就满足要求了
使用类型兼容
举个例子,假设我有500平房子,500万车子,1000万存款(开玩笑哈),你想和我对等换,那么你是不是也得有房子,车子和存款是吧,当然你要是多加点股票啥的我更乐意,这就说明了类型兼容,你要赋值给我,那么你的属性除了和我一样之外,还必须比我多,那么类型兼容就是这样
让我们使用类型兼容试试
// 这个就是你有的 而接口就是我有的,你比我的多const fullNameAll = { firstName: '爱新觉罗', lastName: '小胖纸', age: 22 }const fullName: FullName = fullNameAll
这样就行了,绕过了接口的额外属性检查
使用索引签名
索引签名是个啥,先理解索引,对象的索引是key,数组的索引是下标,那么索引签名呢?就是可以通过索引获取到值,让我们用例子看,还是刚才的例子
// 这里我们定义一个接口interface FullName {firstName: stringlastName: string[ key: string ]: number}
这里我们为接口加了索引签名,意思是什么呢,就是我们通过类型去索引,可以获取到类型的返回值,这样的想法是正确的,但运行之后我们会发现,竟然报错了,原来索引签名的返回值类型必须是已经定义的父类型 。翻译过来的大白话就是,[ key:]: 这个东西就是个可变类型,可以匹配任意多个属性是age: 22这样的属性,而我们已经定义好的属性确是: 返回值类型不匹配,所以报错,那么如何解决呢?
第一就是保持类型统一,这个限制很大,不可能刚刚好都是一个类型 。
第二就是把索引签名的返回值类型设为any 。这样就可以了
interface FullName {firstName: stringlastName: string[ key: string ]: string}// 或interface FullName {firstName: stringlastName: string[ key: string ]: any}
当然这是对象的索引签名,还有数字的索引签名,碧如
interface StrArr {[ index: number ]: string}const strArr: StrArr = ['小胖纸', '大胖纸']
还有一个需要主要的点就是使用数字索引时,会先转换成类型再去索引
这里我们看到类型覆盖掉了类型的索引
当然,索引签名也是可以使用只读属性的,用法和上面一样
接口的继承
接口是可以继承的,想类那样使用关键字就可以
interface FullName {firstName: stringlastName: string}interface FullInfo extends FullName {age: number}const fullInfo: FullInfo = {firstName: '爱新觉罗',lastName: '小胖纸',age: 22}