typescript 回调 写法-用于事件侦听的打字稿反弹函数、类型定义和注释

2024-04-09 0 5,996 百度已收录

打字稿弹跳功能和将在实际项目中交付的事件侦听的类型定义,如果你只是看到它会被蒙蔽,我是

这是我第一次自己录制和学习打字稿,所以我不得不先谈谈我和 Typescript 的关系

记得 2014 年第一次遇到 Typescript 的时候,我根本没看过这个东西,甚至还有一副厌恶的态度,并不是因为它写的代码比原生 JS 多很多。

作为一名后端老手,遇到 Typescript 句型和类型让我想起了我刚开始工作时学到的 FlashActionscript 3.0 脚本时代。不能说一模一样,一模一样。

大约在2006年,Adobe的Flash 9开发了自己的新脚本语言ActionScript3,它完全符合ECMAScript规范的第四个版本,即ES4。

与当时的Javascript还是刀耕火种不同,使用ActionScript3在Flash编辑器中编译代码具有相对合理的类型检查和类型提示。

在之前的 Actionscript 3.0 中

辉煌时代,动漫有Flash,应用有Flex,跨平台桌面应用有Adobeair,支持联通,这种Actionscript 3.0脚本用的就是

Actionscript 3.0 在我掌握它之后从历史中退休了......多么棒的脚本语言,我又白白学了。原因大致是Adobe缺乏进展与其他大公司的联合歼灭

所以当我第一次接触Typescript时,我非常反感。

近年来,Javascript与其他语言相比可能仍然有很大的区别,但它与原来的斜杠和烧毁不同,后端工具和框架相继出现,快速更新迭代Web应用程序变得越来越复杂,后端工具越来越成熟,Typescript应用程序

仅此而已。在团队中使用 Typescript 时,你实际上多写了一点类型代码,它非常有用,你可以说使用完就回不去了

像我们这样的小人物,怎么能抗拒时代的洪流,随波逐流,学又学,直到浪费

如果你学过 Actionscript 3,你会特别熟悉普通 Typescript 的概念和句型,比如类、接口、继承、变量类型等。

唯一更多

不可用和使用的广泛概念是Typescirpt中的“子类”,我认为它更难理解和使用,但我忍不住面对它,我只能看到更多,学到更多

我所学到和理解的,也是别人分享的信息,捡起人的牙齿

别人写的最恶心的文章和书是一堆概念和名词解释。把你放在雾中的云层周围

我希望的是,从实际应用出发,从问题入手,找到解决方案。也就是说,如果你学会了使用什么,你必须学习和使用它才能更好地理解

以下假设您已经对 Typescript 有一些基本的了解

如果您以前没有学过 Typescript,请先退出并学习基础知识!

一、回调函数的类型提示

如果注册自定义风波,如果回弹函数中与风波类型(风波名称)对应的回弹参数不同,则传入反弹函数

我们无能为力

关于这种反弹函数的类型注释,我们只能使用任何,比如addEvent函数,用于注册风暴

事件类型定义为字符串类型

监听器 这是一个函数函数,但由于风波的种类很多typescript 回调 写法,所以有很多对应的反弹函数

这很尴尬,暂时只能使用(...)args:any[])=>any作为侦听器类型

但是,仍然无法澄清侦听器中有多少特定的参数和类型

自定义注册风波函数的类型标注

const addEvent = (eventType: string, listener:(...args: any[]) => any) => {
    console.log(eventType, listener);
    
}
addEvent("eventTypeName1", () => { 
})

如果是这样,则在此调用 addEvent 函数时没有有用的提示

道路

尴尬,不是吗

事件类型不同,对应的侦听器不同

这时你应该考虑是否可以使用类库来解决,子类在进入时只用特定的类型约束编写

首先构建一个类型对象 MyEventMap 进行映射,key 是 eventType 类型,value 是对应的侦听器类型,

添加子类 T,在 MyEventMap 的键范围内使用 extendskeyofMyEventMap 约束 T,通过 keyof 提取键范围,通过 MyEventMap[T] 获取侦听器类型。

type MyEventMap = {
    "eventTypeName1": (a: string) => number
    "eventTypeName2": (test: boolean) => string[]
}
const addEvent = (eventType: T, listener: MyEventMap[T]) => {
    console.log(eventType, listener);
}
addEvent("eventTypeName1", (a) => { 
    return 1
})

所以有提示,看疗效

两个关键点

二、代理DOM风暴评论的类型

例如,如果你自己编写一个 Js 框架,其中要求是实现 addEventListener 代理函数,那么如何为这个代理函数编写 ts 注释

on(”

click“,()=>{}),并且可以提示 Typescript 默认提供类型,并在 dom 中约束 eventName

const on = (eventName: string,  listener: (...args: any[]) => any) => {
    console.log(eventName, listener);
}

像这样写也通过了检查...这绝对是不行的,因为要求被限制在 dom storms 中,但现在它将 eventName 限制为字符串

on("click", () => {
})

尴尬,我们必须在ts提供的lib.dom.d.ts文件中找到答案

在源代码中查找interfaceHTML的套接字定义

addEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;

事实上,HTMLElementEventMap 是我们正在寻找的地图,用于通过 eventName 映射特定的反弹

然后按照前面的自定义注册函数一样处理它,即

const on = (eventName: T,  listener: (this: HTMLElement, ev: HTMLElementEventMap[T]) => any, options?: boolean | AddEventListenerOptions) => {
    console.log(eventName, listener, options);
}

所以有正常的提示

on("mousedown", (e) => {
    console.log(e)
})

on("paste", (e) => {
    console.log(e)
})

用于获取的 TS 注释

在很多情况下,我们会使用 dataasUser[] 来获取请求函数来主动告诉编译器返回的数据类型,这很有用但并不高尚

我们将遵循思路,让我们尝试 TS 注释获取请求函数

同样,首先构建一个 ResponseMap,键是 3,fetch 请求地址值是 fetch 返回的数据类型

type ResponseMap = {
    "hello/world": number
    "test/getlist": string[]
}

const get = async (url: T):Promise => {
    const response = await fetch(url);
    return response.json();
}

测试它

get("hello/world")

get("test/getlist")

尝试一下是完美的,但是,它肯定不是那么简单,而且在许多情况下,请求地址带有参数

get("test/getlist?a=1&b=2")

发现提示错误未通过校准

果然typescript 回调 写法,类型很麻烦...

!! 子类匹配有待改进

const get = async (url: T  | `${T}?${string}`):Promise => {
    const response = await fetch(url);
    return response.json();
}
get("test/getlist?a=1&b=2")

现在可以校准了,提示工作正常

关键是

url:T|${T}?${string}

这句话的变化通过字符串模板提取 T

最后,

建议是基类也需要更友好的命名,T、K、R等太不友好了,可以更命名如下,范围名称要做得更具体

const addEvent = (eventType: EventType, listener: MyEventMap[EventType]) => {
    console.log(eventType, listener);
}
const get = async (url: FetchUrl  | `${FetchUrl}?${string}`):Promise => {
    const response = await fetch(url);
    return response.json();
}

注:以上知识在美国被打字稿的视频听到,但未找到原始视频内容。其实很多中文内容都没翻译过,我只是把知识转化理解,所以叫捡人牙......

cnblogs.com/willian/

原文链接:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 typescript typescript 回调 写法-用于事件侦听的打字稿反弹函数、类型定义和注释 https://www.wkzy.net/game/200359.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务