大家好,我是前端理想哥,今天是我们 TS 学习的第2课,本节视频我们来讲下TS中的一个重要知识点:接口
接口的最简单理解就是:TypeScript 通过“鸭式辨型法”来检查一个值的结构,确保它符合预期。听起来是不是有点抽象?别担心,我们来看一段代码,马上就能明白了!
interface LabelInfo {
label: string;
}
function getLabel(labelInfo: LabelInfo) {
// 这里会有一些操作
}
const myLabel = {
size: 5,
label: 'get 5 object',
}
getLabel(myLabel);
这里的 LabelInfo
就像是一个契约,它告诉 getLabel
函数:“嘿,你传入的 labelInfo 对象,必须有一个 label 属性,并且它的类型得是 string。” 看起来是没错的吧?
但你可能会问了:LabelInfo 接口里明明没有 size 属性,为什么我传了个有 size 属性的对象也能通过呢?🤔
这就是 TypeScript
的 鸭子类型(Duck Typing)
原理:只要一个对象符合接口要求的属性,它就认为这个对象实现了接口。就算 myLabel 多了 size 属性,只要它有 label 属性,TypeScript 就认为它合法!是不是很灵活?👌
那如果接口中某些属性不一定存在怎么办呢?这时我们可以使用可选属性!用法简单得很,只需要在属性名后加个问号 ?。
interface LabelInfo {
label: string;
color?: string;
age?: number;
}
看到没?color 和 age 后面加了个问号,表示它们是可选的,也就是说,这些属性可能有,也可能没有。这样做的好处是什么呢?
- 提前定义可能存在的属性,让代码更清晰。
- 访问不存在的属性时会报错,帮助我们避免 BUG!👍
再来看一个非常有用的特性——只读属性。有时候我们不希望某些对象属性被修改,这时我们就可以给属性加上 readonly
修饰符。
interface Point {
readonly x: number;
readonly y: number;
}
const p1: Point = {
x: 10,
y: 20,
}
p1.x = 5 // error!
看到没?当我们尝试修改 p1.x 时,TypeScript 会直接报错!因为 x 是只读的,不能被改变。是不是觉得 TS 真的很聪明,帮我们省了不少心?😉
说完了对象,我们再来看看接口如何描述函数类型。其实很简单,我们只需要定义函数的参数类型和返回值类型,TypeScript 就会帮我们检查了。
interface SearchParams {
(source: string, subString: string): boolean;
}
const mySearch: SearchParams = function(source: string, subString: string): boolean {
return source.search(subString) !== -1;
}
这里,SearchParams 表示的是一个接受两个 string 类型参数,并返回一个 boolean 的函数。然后我们创建了一个 mySearch 函数,它符合 SearchParams 的定义。你会发现,TS 会帮我们自动检查参数类型是否匹配!
而且,参数名其实不是必须一致的,只要位置和类型对就行。例如:
const mySearch: SearchParams = function(sou: string, sub: string): boolean {
return sou.search(sub) !== -1;
}
参数名可以不同,TS 只会检查类型!这就像找对象时,不要求你叫“张三”或者“李四”,只要你和身份证上的名字一致就行!😂
总结:
今天我们学习了 TypeScript 中的接口,具体包括:
-
- 接口定义对象结构的契约。
-
- 可选属性让我们可以灵活定义有可能存在或不存在的属性。
-
- 只读属性保护了我们的数据不被修改。
-
- 接口还可以描述函数类型,确保函数参数和返回值的类型安全。
大家明白了吗?如果你觉得这些内容有帮助,不要忘记点个赞,关注一下!下次我们将讲解Typescript中的另外一个重要概念-可索引类型!😉