关于接口的疑惑

来源:3-11 接口 - 额外属性检查+函数类型+可索引的类型

小学生6年级

2019-04-28

interface Person {
    firstName: string
    lastName: string
}

// 报错
let p: Person = {firstName: 'a', lastName: 'b', fullName: 'ab'}


// 正确
function sayHel(person: Person) {
    return 'Hello ' + person.firstName + ' ' + person.lastName
}

const user = {
    firstName: 'a',
    lastName: 'b',
    fullName: 'ab'
}

sayHel(user)

这两个情况不是一样的么,为什么一个报错另一个不报错?是因为函数参数逆变?

写回答

1回答

ustbhuangyi

2019-04-28

正如课程所说的那样,如果直接用对象字面量,TypeScript 编译器就能检查出额外的属性会报错,但是如果用了一个变量,就检测不出来了。

如果你直接调用

sayHel({
   firstName: 'a',
   lastName: 'b',
   fullName: 'ab'
})

也是会报错的。

虽然用变量检测不出来,但这也是有危险的,所以通常如果我们有额外的属性,要么为接口添加索引签名,要么修改接口的定义。

0
0

下一代前端开发语言 TypeScript从零重构axios

课程从零开始重构功能完整的JS库,是学习造轮子的不二之选!

2631 学习 · 877 问题

查看课程