首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 1 章 准备知识
1.1 前端技术简介
1.2 HTML入门
1.2.1 准备开发工具
1.2.2 HTML中的基础标签
1.3 CSS入门
1.3.1 CSS选择器入门
1.3.2 CSS样式入门
1.4 JavaScript入门
1.4.1 我们为什么需要JavaScript
1.4.2 JavaScript语法简介
1.4.3 从JavaScript到TypeScript
1.5 渐进式开发框架Vue
1.5.1 第一个Vue应用
1.5.2 范例:一个简单的用户登录页面
1.5.3 Vue 3的新特性
1.5.4 我们为什么要使用Vue框架
第 2 章 TypeScript基础
2.1 重新认识TypeScript
2.1.1 安装TypeScript
2.1.2 TypeScript语言版本的HelloWorld程序
2.1.3 使用高级IDE工具
2.2 TypeScript中的基本类型
2.2.1 布尔、数值与字符串
2.2.2 特殊的空值类型
2.2.3 数组与元组
2.3 TypeScript中有关类型的高级内容
2.3.1 枚举类型
2.3.2 枚举的编译原理
2.3.3 any、never与object类型
2.3.4 关于类型断言
2.4 函数的声明和定义
2.4.1 函数的类型
2.4.2 可选参数、默认参数和不定个数参数
2.4.3 函数的重载
第 3 章 TypeScript中的面向对象编程
3.1 理解与应用“类”
3.1.1 类的定义与继承
3.1.2 类的访问权限控制
3.1.3 只读属性与存取器
3.1.4 关于静态属性与抽象类
3.1.5 类的实现原理
3.2 接口的应用
3.2.1 接口的定义
3.2.2 使用接口约定函数和可索引类型
3.2.3 使用接口来约束类
3.2.4 接口的继承
3.3 TypeScript中的类型推断与高级类型
3.3.1 关于类型推断
3.3.2 联合类型与交叉类型
3.3.3 TypeScript的类型区分能力
3.3.4 字面量类型与类型别名
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(一)
小册名称:TypeScript和Vue从入门到精通(一)
### 2.4.1 函数的类型 在TypeScript中,函数的类型是一个核心概念,它允许开发者以静态方式(即在编译时)定义函数的结构,包括其参数的类型、返回值的类型,以及是否有剩余参数或重载等特性。这种类型系统增强了代码的可读性、可维护性和健壮性。本章节将深入探讨TypeScript中函数的类型定义、使用场景以及高级特性。 #### 2.4.1.1 基本函数类型 在TypeScript中,你可以直接通过类型别名(Type Aliases)或接口(Interfaces)来定义函数的类型。基本形式如下: ```typescript // 使用类型别名定义函数类型 type Add = (x: number, y: number) => number; // 定义一个符合Add类型的函数 const add: Add = (x, y) => x + y; // 使用接口定义函数类型 interface Subtract { (x: number, y: number): number; } const subtract: Subtract = (x, y) => x - y; ``` 在上述例子中,`Add` 和 `Subtract` 分别通过类型别名和接口定义了两种函数类型,它们都接受两个`number`类型的参数并返回一个`number`类型的结果。TypeScript编译器会检查函数`add`和`subtract`的实现是否符合其类型声明,确保类型安全。 #### 2.4.1.2 可选参数与默认参数 在TypeScript中,函数参数可以是可选的,也可以有默认值。但是,当定义函数类型时,所有带默认值的参数必须跟在可选参数之后。 ```typescript type Greet = (name?: string, greeting?: string) => void; // 正确使用可选参数 const greet: Greet = (name, greeting = "Hello") => { if (name) { console.log(`${greeting}, ${name}!`); } else { console.log(greeting); } }; // 注意:下面这种写法在定义Greet类型时不允许,因为默认参数不能出现在可选参数之前 // type GreetWithDefault = (greeting: string = "Hello", name?: string) => void; // 错误 greet("Alice"); // Hello, Alice! greet(); // Hello ``` #### 2.4.1.3 剩余参数 当函数需要处理不定数量的参数时,可以使用剩余参数(Rest Parameters)。在TypeScript中,剩余参数的类型会被推断为数组类型,并可以在函数类型定义中显式指定其元素类型。 ```typescript type Sum = (...numbers: number[]) => number; const sum: Sum = (...numbers) => numbers.reduce((acc, cur) => acc + cur, 0); console.log(sum(1, 2, 3, 4)); // 10 ``` 在这个例子中,`Sum`类型表示一个接受任意数量`number`类型参数并返回一个`number`的函数。剩余参数`...numbers`在函数`sum`中被收集到一个`number[]`数组中,并通过`reduce`方法计算总和。 #### 2.4.1.4 函数重载 函数重载允许一个函数根据传入的参数类型或数量的不同而执行不同的逻辑。在TypeScript中,你可以通过为同一个函数名编写多个函数类型定义来实现函数重载。编译器会根据调用时提供的参数来解析应该使用哪个函数签名。 ```typescript function reverse(x: number): number; function reverse(x: string): string; function reverse(x: number | string): number | string { if (typeof x === 'number') { return Number(x.toString().split('').reverse().join('')); } else if (typeof x === 'string') { return x.split('').reverse().join(''); } } console.log(reverse(123)); // 321 console.log(reverse("hello")); // olleh ``` 在这个例子中,`reverse`函数根据传入参数是`number`还是`string`,执行不同的反转逻辑。注意,函数体本身需要能够处理所有重载情况,且TypeScript编译器仅通过类型签名来检查调用是否合法,不会检查函数体内部的逻辑是否一致。 #### 2.4.1.5 泛型函数 泛型(Generics)是TypeScript中一个非常强大的特性,它允许在定义函数、接口或类时不指定具体的类型,而是在使用时由调用者指定。这对于编写可重用的组件库特别有用。 ```typescript function identity<T>(arg: T): T { return arg; } console.log(identity<string>("myString")); // myString console.log(identity<number>(42)); // 42 // 泛型函数也可以有多个类型参数 function swap<T, U>(tuple: [T, U]): [U, T] { return [tuple[1], tuple[0]]; } console.log(swap([7, "seven"])); // ["seven", 7] ``` 在`identity`函数中,`T`是一个类型参数,表示`identity`函数可以接受任何类型的参数并返回相同类型的值。`swap`函数展示了如何定义具有多个类型参数的泛型函数,它接受一个元组并返回其元素位置交换后的新元组。 #### 2.4.1.6 函数作为参数与返回类型 在TypeScript中,函数本身也是一等公民,可以作为参数传递给其他函数,也可以作为其他函数的返回值。这使得TypeScript非常适合于编写函数式编程风格的代码。 ```typescript function higherOrderFunction(func: (x: number) => number, value: number): number { return func(value); } const double = (x: number) => x * 2; console.log(higherOrderFunction(double, 3)); // 6 // 函数作为返回值 function createAdder(x: number): (y: number) => number { return (y) => x + y; } const addFive = createAdder(5); console.log(addFive(3)); // 8 ``` 在上面的例子中,`higherOrderFunction`接受一个函数`func`和一个值`value`作为参数,并返回`func(value)`的结果。`createAdder`函数则返回一个新的函数,该函数接受一个参数`y`并返回`x + y`的结果,其中`x`是`createAdder`被调用时指定的。 ### 总结 TypeScript中函数的类型定义提供了丰富的特性,包括基本类型定义、可选参数与默认参数、剩余参数、函数重载、泛型函数,以及函数作为参数和返回类型等。这些特性使得TypeScript在开发复杂应用程序时能够提供强大的类型检查和灵活的代码复用能力。通过合理使用这些特性,可以编写出既安全又高效的TypeScript代码。
上一篇:
2.4 函数的声明和定义
下一篇:
2.4.2 可选参数、默认参数和不定个数参数
该分类下的相关小册推荐:
TypeScript和Vue从入门到精通(三)
TypeScript和Vue从入门到精通(四)
TypeScript和Vue从入门到精通(五)
Vue原理与源码解析
vuejs组件实例与底层原理精讲
Vue.js从入门到精通(二)
Vue面试指南
TypeScript和Vue从入门到精通(二)
Vue.js从入门到精通(三)
VUE组件基础与实战
vue项目构建基础入门与实战
Vue.js从入门到精通(四)