理解泛型调用和函数调用签名
2023-02-26 09:51:51 时间
这里通过五个示例逐步理解泛型调用和函数调用签名
/*
* @Author: Zheng Lei
* @Email: baimoc@163.com
* @Date: 2023-01-18 16:29:21
* @LastEditTime: 2023-01-18 17:13:43
* @FilePath: \baimo_music\demo.ts
*/
// 一、--------------------------------------------------------
// () 内是函数参数类型约束
// : 后是函数返回值类型约束
interface IFnCall {
(name: string, age: number): string
}
// IFnCall 是函数调用签名
const foo: IFnCall = function (name, age) {
return name + age
}
// 函数调用
foo('tom', 10)
// --------------------------------------------------------
// 定义第一个参数为一个函数,并且该函数返回值的类型为 string
interface IFnCall2 {
(fn: () => string, age: number): string
}
const foo2: IFnCall2 = function () {
return ''
}
foo2(() => {
return ''
}, 10)
// ----------------------------------------------------------
// <MyType> 代表函数调用时的类型约束
// 其中第一个参数为一个函数,并且返回值的类型为 MyType
interface IFnCall3 {
<MyType>(fn: () => MyType, age: number): string
}
const foo3: IFnCall3 = function () {
return ''
}
foo3<number>(() => {
return 11
}, 10)
// 报错写法, MyType 类型不一致
// foo3<string>(() => {
// return 11
// }, 10)
// 正确写法
foo3<number>(() => {
return 11
}, 10)
// 不传入类型,则会进行类型推断
foo3(() => {
return 11
}, 10)
// ----------------------------------------------------------
// <MyType> 代表函数调用时的类型约束
// 其中第一个参数为一个函数,并且返回值的类型为 MyType
// IFnCall4 的返回值类型也为 MyType
interface IFnCall4 {
<MyType>(fn: () => MyType, age: number): MyType
}
const foo4: IFnCall4 = function (fn) {
return fn()
}
// 这里对 foo4 的返回值进行类型约束,
foo4<number>(() => {
return 11
}, 10)
// -----------------------------------------------------------
// <MyType> 代表函数调用时的类型约束
// <IRoot> 代表函数定义时的类型约束
interface IFnCall5<IRoot> {
<MyType>(fn: (name: IRoot) => MyType, age: number): MyType
}
const foo5: IFnCall5<string> = function (fn) {
return fn('Tom')
}
// 类型推断过程
// IFnCall5 的 IRoot 定义 string 类型
// 根据 fn 的 name 的 IRoot 类型 推断 fn 函数的返回值 MyType 为 string 类型
// 得到 foo5 函数调用时类型也为 string
// 得到 foo5 函数返回值类型也为 string
// 因此,可以通过fn参数一的返回值推断出 IFnCall5 的返回值类型
const res = foo5((name) => {
return name
}, 10)
console.log(res)
相关文章
- Jgit的使用笔记
- 利用Github Action实现Tornadofx/JavaFx打包
- 叹息!GitHub Trending 即将成为历史!
- 微软软了?开源社区讨论炸锅,GitHub CEO 亲自来答
- GitHub Trending 列表频现重复项,前后端都没去重?
- Photoshop Elements 2021版本软件安装教程(mac+windows全版本都有)
- (ps全版本)Photoshop 2020的安装与破解教程(mac+windows全版本都有)
- (ps全版本)Photoshop cc2018的安装与破解教程(mac+windows全版本,包括2023
- 环境搭建:Oracle GoldenGate 大数据迁移到 Redshift/Flat file/Flume/Kafka测试流程
- 每个开发人员都要掌握的:最小 Linux 基础课
- 来撸羊毛了!Windows 环境下 Hexo 博客搭建,并部署到 GitHub Pages
- 超实用!手把手入门 MongoDB:这些坑点请一定远离
- 【GitHub日报】22-10-09 zustand、neovim、webtorrent、express 等4款App今日上新
- 【GitHub日报】22-10-10 brew、minio、vite、seaweedfs、dbeaver 等8款App今日上新
- 【GitHub日报】22-10-11 cobra、grafana、vue、ToolJet、redwood 等13款App今日上新
- Photoshop 2018 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2017 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2020 下载及安装教程(mac+windows全版本都有,包括最新的2023)
- Photoshop 2023 资源免费下载(mac+windows全版本都有,包括最新的2023)
- 最新版本Photoshop CC2018软件安装教程(mac+windows全版本都有,包括2023