6.29 drilling notes - typescript

34 阅读2分钟

知识总结:

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'}//编译通过