# 接口(interface)
TypeScript 的核心原则之一是对值所具有的结构进行类型检查,它有时被称做“鸭式辨型法”或“结构性子类型化”。
在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。
# 接口的使用
比如我们有一个函数,这个函数接受一个 User 对象,然后返回这个 User 对象的 name 属性:
const getUserName = (user) => user.name
@前端进阶之旅: 代码已经复制到剪贴板
在我们自定义的 TypeScript 开发环境下这个是会报错的:

我们必须用一种类型描述这个 user 参数,但是这个类型又不属于上一节介绍到的各种基本类型。
这个时候我们需要 interface 来描述这个类型:
interface User {
name: string
age: number
isMale: boolean
}
const getUserName = (user: User) => user.name
@前端进阶之旅: 代码已经复制到剪贴板
这个接口 User 描述了参数 user 的结构,当然接口不会去检查属性的顺序,只要相应的属性存在并且类型兼容即可。
# 可选属性
那么还有一个问题,当这个 user 属性可能没有 age 时怎么办?比如我们在前端处理表单的时候,年龄 age 这个字段本身是可选的,我们应该如何用接口描述这种情况?
我们可以用可选属性描述这种情况:
interface User {
name: string
age?: number
isMale: boolean
}
@前端进阶之旅: 代码已经复制到剪贴板
当我们看到代码提示的时候,这个 age 属性既可能是number类型也可能是 undefined 。

# 只读属性
还有一个问题,当我们确定 user 的性别之后就不允许就改了, interface 可以保证这一点吗?
利用 readonly 我们可以把一个属性变成只读性质,此后我们就无法对他进行修改
interface User {
name: string
age?: number
readonly isMale: boolean
}
@前端进阶之旅: 代码已经复制到剪贴板
一旦我们要修改只读属性,就会出现警告⚠️。

# 函数类型
那么接下来,如果这个 user 含有一个函数怎么办?
比如:
