知识总结:
type是类型别名,不可重复定义;interface可重复定义,相当于intersection,重名属性不同类型会导致never类型的出现
交叉intersection、联合union。联合类型只要满足联合的类型的一种,就可以满足类型了。
整理一下思路,
此前工作中,多是用typescript规定一下后端返回的数据类型,一些函数的返回值、参数类型。
今天研究的几个问题:
type和interface的区别?
type关键字只是一个类型别名。和interface不一样。
文档。interface可以重名再写一块来扩展之前定义的同名interface,type只能写一个,不能再打开、拓展了
interface SomeObj{
name1:string
}
interface SomeObj{
name2:number //接口SomeObj会被拓展name2属性,是一个merge的过程,如果property重名则会报错
}
let obj:SomeObj={name1:'hello',name2:2}
console.log(obj)
typescript高级类型?
intersection交叉类型 用&链接要并的类型
注意是取并集,产生新的类型,注意要同时满足交叉的各个类型的要求才可以编译通过;
下面例子里student 如果少了个nameb就会报类型错,说b里有nameb还未出现在对象里
type a= { name:string age:number}
type b={ nameb:string age:number}
let student:a&b={name:'hao',age:3,nameb:'wang'}
和extends有啥区别: 文档
interface PersonA{
name:string //这里name是字符串
}
interface PersonB{
name:number//这里name是number
}
let student: PersonA&PersonB = {name:1}//typescript对于同名的属性intersection的时候,
//如果该属性类型在各个子类型中不相同,则认为是never
//Type 'number' is not assignable to type 'never'.ts(2322)// The expected type comes from property 'name'
// which is declared here on type 'PersonA & PersonB'//(property) name: never
//同名属性extends的时候呢?也会报错,提示name属性不兼容
union. | 联合。 这个变量可能是联合的类型的任选其一。但会发现如果定义的变量满足intersection其实也能编译通过,这是因为交叉类型作为并集,可以赋值到联合类型的各个类型上 所以不会报错
type a= { name:string age:number}
type b={ nameb:string age:number, anothernameb:string}
let student:a|b={name:'hao',age:3,nameb:'wang'}//编译通过