【TS】-类型兼容性
TypeScript的类型兼容性是基于采用结构类型,也就是仅看其成员结构,而不是名义类型
原始类型和对象类型
interface Named = {
name: string
}
class Person {
name: string
}
let p : Named
p = new Person()
在以上例子中,虽然p是实现了Named接口,但因为其成员name类型和Person类中的name类型相同。所以不会报错。
interface Named = {
name: string
}
let x = {name: 'ashen', age: 21}
let y : Named
x = y // Error
y = x // ok
在以上例子中,将y赋值给x,需要检查y中是否有x所需要的所有属性,由于缺少age,所以报错;而x赋值给y时,由于x中有y需要的name属性,且为string类型,所以不报错。
function sayHi(n : Named){
console.log('Hi, my name is ' + n.name)
}
sayHi(x) // ok
函数比较
let x = (a: number) => 0
let y = (a: number, b: string) => 0
x = y // Error
y = x // ok
对于函数来说,被赋值的函数的参数,应该包含赋值的函数的参数。例如js中Array的forEach方法,其原本包含三个参数:数组元素、索引、被遍历的数组。但是在使用时,可以如下只传入一个参数:
let arr = [1, 2, 3]
arr.forEach(item => {
console.log(item)
}
)
下面来看看如何处理返回值不同的函数
let x = () => ({name: 'ashen'})
let y = () => ({name: 'ashen', age: 21})
x = y // ok
y = x // Error
在TypeScript中强制源函数的返回值类型必须是目标函数返回值类型的子类型