有一个专门做lol同人的网站/网站优化基本技巧

有一个专门做lol同人的网站,网站优化基本技巧,跨境出口b2b平台有哪些,网站怎样做谷歌推广一、什么是类型断言? 类型断言(Type Assertion)是 TypeScript 中一种显式指定变量类型的方式,它告诉编译器:“我比编译器更清楚这个值的类型”。​这不是运行时类型转换,而是编译阶段的类型声明辅助机制。…
一、什么是类型断言?

类型断言(Type Assertion)是 TypeScript 中一种显式指定变量类型的方式,它告诉编译器:“我比编译器更清楚这个值的类型”。​这不是运行时类型转换,而是编译阶段的类型声明辅助机制。类型断言不会改变变量的实际内存结构,仅影响编译阶段的类型检查。

// 假设从第三方库获取的数据被识别为 any 类型
const rawData: any = '2023-10-01';// 开发者明确知道这是日期字符串,使用类型断言
const dateString = rawData as string;
console.log(dateString.slice(0,4)); // 输出 "2023"
二、类型断言的两套语法
  1. 尖括号语法​(不适用于 JSX)
const value: any = "hello";
const strLength: number = (<string>value).length;
  1. as 语法​(推荐通用写法)
const value: any = "hello";
const strLength: number = (value as string).length;
三、典型应用场景(附代码示例)
1. 处理联合类型收窄
interface Cat { meow(): void }
interface Dog { bark(): void }function handleAnimal(pet: Cat | Dog) {// 明确知道当前是 Cat 类型时if ('meow' in pet) {(pet as Cat).meow(); // 断言辅助调用特定方法}
}
2. DOM 元素类型断言
// 获取元素时编译器无法推断具体类型
const inputElement = document.getElementById('username') as HTMLInputElement;
inputElement.value = 'admin'; // 断言后可直接访问 value 属性const canvas = document.querySelector('#gameCanvas') as HTMLCanvasElement;
const ctx = canvas.getContext('2d'); // 正确识别 canvas 上下文类型
3. 处理 any 类型转换
// 从 localStorage 获取的序列化数据
const userData: any = JSON.parse(localStorage.getItem('user'));// 开发者明确数据结构时进行断言
interface UserProfile {id: number;name: string;
}
const profile = userData as UserProfile;
console.log(profile.name.toUpperCase()); // 编译通过
4. 非空断言(慎用!)
type Person = {name?: string;age?: number;
}function printName(person: Person) {// 明确知道 name 属性必然存在console.log(person.name!.toUpperCase()); // ! 表示非空断言
}printName({ name: 'Alice' }); // 正确输出 "ALICE"
四、使用建议与最佳实践
  1. 优先使用类型守卫
// 比类型断言更安全的做法
function isCat(pet: Cat | Dog): pet is Cat {return 'meow' in pet;
}if (isCat(pet)) {pet.meow(); // 自动类型收窄
}
  1. 外部数据必须验证
interface APIResponse {code: number;data: { items: string[] };
}// 从网络请求获取的数据
fetch('/api/data').then(res => res.json()).then((raw: unknown) => {// 先进行类型断言再进行校验const response = raw as APIResponse;if (response.code === 200 && Array.isArray(response.data?.items)) {// 安全使用数据}});
  1. 避免多层嵌套断言
// 错误示例:双重断言绕过类型检查
const value = 123 as any as string; // 正确做法:重新设计类型结构
interface StringOrNumber {value: string | number;
}
  1. 为复杂对象提供类型声明文件
// 第三方库类型增强示例
declare module 'legacy-library' {interface WidgetConfig {id: string;dimensions: [number, number];}export function createWidget(config: WidgetConfig): HTMLElement;
}// 使用时有完整类型提示
import { createWidget } from 'legacy-library';
createWidget({ id: 'w1', dimensions: [100, 200] });
五、需要警惕的陷阱
  1. 断言与运行时类型不符
const num: any = 123;
const str = num as string;console.log(str.toUpperCase()); // 编译通过,运行时报错!
  1. 过度使用 any 类型
// 错误示范:滥用 any 导致类型系统失效
const dangerous: any = fetchExternalData();
const processed = dangerous as UserData;// 正确做法:定义精确类型并验证
interface ValidatedData { /* ... */ }
function validate(data: unknown): data is ValidatedData { /* ... */ }
  1. 忽略可选属性风险
interface Config {timeout?: number;
}function init(config: Config) {// 危险的非空断言!const safeTimeout = config.timeout! * 1000; 
}init({}); // 运行时得到 NaN
六、性能与工程化考量
  1. 在构建流程中加入类型检查
# 开启严格模式编译
tsc --strict --noImplicitAny
  1. 使用 ESLint 规则约束
{"@typescript-eslint/consistent-type-assertions": ["error",{ "assertionStyle": "as","objectLiteralTypeAssertions": "never"}]
}
总结

类型断言是 TypeScript 开发中的瑞士军刀,但要谨慎使用。建议遵循以下原则:

  1. 优先使用类型推断和类型守卫
  2. 对外部数据坚持运行时校验
  3. 断言范围尽量缩小到变量级别
  4. 在团队中制定统一的断言使用规范

通过合理运用类型断言,可以在保持类型安全的前提下,灵活处理边界场景,提升代码可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++从入门到入土(八)——多态的原理

目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中&#xff0c;我们介绍了C三大特性之一的多态&#xff0c;我们主要介绍了多态的构成条件&#xff0c;但是对于多态的原理我们探讨的是不够深入的&#xff0c;下面这这一篇文章&#xff0c;我们将…

Linux目录理解

前言 最近在复习linux&#xff0c;发现有些目录总是忘记内容&#xff0c;发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下&#xff1a; 1. 根目录 / (Root Directory) 英文含义&#xff1a;/ 是文件系统的根…

c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!

文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…

植物知识分享论坛毕设

1.这四个文件直接是什么关系&#xff1f;各自都是什么作用&#xff1f;他们之间是如何联系的&#xff1f; 关系与联系 UserController.java 负责接收外部请求&#xff0c;调用 UserService.java 里的方法来处理业务&#xff0c; 而 UserService.java 又会调用 UserMapper.jav…

Business processes A bridge to SAP and a guide to SAP TS410 certification

Business processes A bridge to SAP and a guide to SAP TS410 certification

算法 之 ST表

文章目录 区间最大值 ST表(Sparse Table)是一种高效处理静态数据区间查询的数据结构&#xff0c;主要的作用是用于快速查询区间的最值&#xff0c;区间GCD,区间按位与或 在这里以区间最大值为例子说明st表的模版 总体的思想就是定义dp[i][j]表示下标为i长度为2^j的区间的最大值…

Deepseek X 文心智能体:谐音梗广告创意大师

体验链接 飞书文档 一、引言 在当今竞争激烈的市场环境下&#xff0c;广告创意对于产品或服务的推广至关重要。谐音广告以其独特的语言魅力&#xff0c;能够迅速吸引受众的注意力并留下深刻印象。本智能体旨在利用 DeepSeek 模型强大的语言分析和推理能力&#xff0c;为用户…

TCP简单链接的编程实现

TCP简单链接的编程实现 本文主要介绍TCP应用层的编码实现。 TCP是一种面向连接的、可靠的、基于字节流的传输层协议&#xff0c;它是互联网协议套件&#xff08;TCP/IP&#xff09;中的核心协议之一&#xff0c;广泛应用于需要可靠数据传输的场景&#xff0c;如&#xff1a;网…

【RHCE实验】搭建主从DNS、WEB等服务器

目录 需求 环境搭建 配置nfs服务器 配置web服务器 配置主从dns服务器 主dns服务器 从dns服务器 配置客户端 客户端测试 需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容…

【HarmonyOS Next之旅】DevEco Studio使用指南(三)

目录 1 -> 一体化工程迁移 1.1 -> 自动迁移 1.2 -> 手动迁移 1.2.1 -> API 10及以上历史工程迁移 1.2.2 -> API 9历史工程迁移 1 -> 一体化工程迁移 DevEco Studio从 NEXT Developer Beta1版本开始&#xff0c;提供开箱即用的开发体验&#xff0c;将SD…

nodejs使用 mysql2 模块获取 mysql 中的 json字段,而不是 mysql

mysql 模块获取的 json 字段&#xff0c;是字符串mysql2 模块获取的 json 字段&#xff0c;是符合预期的 json 对象 mysql mysql2 最后编辑于&#xff1a;2025-02-24 22:16:53 © 著作权归作者所有,转载或内容合作请联系作者 喜欢的朋友记得点赞、收藏、关注哦&#xff01;…

【网工第6版】第1章 计算机网络概论

目录 1计算机网络形成和发展 ■计算机网络 ■我国互联网发展 ■计算机网路分类 ■计算机网络应用 2 OSI和TCP/IP参考模型 ■网络分层的意义 ■OSI参考模型 ■TCP/IP参考模型 ■TCP/IP参考模型协议 3 数据封装与解封过程 ■封装 ■解封 1计算机网络形成和发展 ■计…

理解我们单片机拥有的资源

目录 为什么要查询单片机拥有的资源 所以&#xff0c;去哪些地方可以找数据手册 一个例子&#xff1a;STM32F103C8T6 前言 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite STM32 Common Repositorieshttps://github.com/C…

《我的Python觉醒之路》之转型Python(十五)——控制流

[今天是2025年3月17日&#xff0c;继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python&#xff08;十四&#xff09;——控制流

AndroidStudio+Android8.0下的Launcher3 导入,编译,烧录,调试

文章目录 编译完成搜索输出文件Android.mk配置gradle编译环境报错一报错二报错三输出文件下载INSTALL_FAILED_TEST_ONLY查找系统签名查找签名工具开始签名查看签名签名问题重新生成秘钥解决方案生成成功挽救错误:重新刷机更换testkey秘钥keystore生成keystoreINSTALL_FAILED_S…

Linux--gdb/cgdb

ok&#xff0c;我们今天学习gdb的安装和使用 调试器-gdb/cgdb使用 VS、VScode编写的代码一般都是release格式的&#xff0c;gdb 的格式一般是debug 换成debug模式命令 :-g gdb会记录最新的一条命令&#xff0c;直接回车就是默认执行该命令 一个调试周期下&#xff0c;断点…

ModBus TCP/RTU互转(主)(从)|| Modbus主动轮询下发的工业应用 || 基于智能网关的串口服务器进行Modbus数据收发的工业应用

目录 前言 一、ModBus TCP/RTU互转&#xff08;从&#xff09;及应用|| 1.1 举栗子 二、ModBus TCP/RTU互转&#xff08;主&#xff09; 2.1 举栗子 三、ModBus 主动轮询 3.1 Modbus主动轮询原理 3.2 Modbus格式上传与下发 3.2.1.设置Modbus主动轮询指令 3.2.2 设…

【操作系统安全】任务2:用户与用户组

目录 一、用户与用户组介绍 1.1 用户 1.2 用户组 1.3 用户与用户组的关系 二、用户与用户组管理 2.1 用户管理 2.1.1 创建用户 2.1.2 设置用户密码 2.1.3 删除用户 2.2 用户组管理 2.2.1 创建用户组 2.2.2 删除用户组 2.2.3 将用户添加到用户组 三、影子账户创建…

OpenCV计算摄影学(20)非真实感渲染之增强图像的细节函数detailEnhance()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此滤波器增强特定图像的细节。 cv::detailEnhance用于增强图像的细节&#xff0c;通过结合空间域和频率域的处理&#xff0c;提升图像中特定细节…

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…