TypeScript 中提升幸福感的 10 个高级技巧(下)

简介: TypeScript 中提升幸福感的 10 个高级技巧(下)

6. 查找类型


interface Person {
    addr: {
        city: string,
        street: string,
        num: number,
    }
}


当需要使用 addr 的类型时,除了把类型提出来


interface Address {
    city: string,
    street: string,
    num: number,
}
interface Person {
    addr: Address,
}


还可以


Person["addr"] // This is Address.
比如:
const addr: Person["addr"] = {
    city: 'string',
    street: 'string',
    num: 2
}


微信图片_20220513163158.png


有些场合后者会让代码更整洁、易读。


7. 查找类型 + 泛型 + keyof


泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。


interface API {
    '/user': { name: string },
    '/menu': { foods: string[] }
}
const get = <URL extends keyof API>(url: URL): Promise<API[URL]> => {
    return fetch(url).then(res => res.json());
}
get('');
get('/menu').then(user => user.foods);


微信图片_20220513163229.png


微信图片_20220513163238.png


8. 类型断言


Vue 组件里面经常会用到 ref 来获取子组件的属性或者方法,但是往往都推断不出来有啥属性与方法,还会报错。


子组件:


<script lang="ts">
import { Options, Vue } from "vue-class-component";
@Options({
  props: {
    msg: String,
  },
})
export default class HelloWorld extends Vue {
  msg!: string;
}
</script>


父组件:


<template>
  <div class="home">
    <HelloWorld
      ref="helloRef"
      msg="Welcome to Your Vue.js + TypeScript App"
    />
  </div>
</template>
<script lang="ts">
import { Options, Vue } from "vue-class-component";
import HelloWorld from "@/components/HelloWorld.vue"; // @ is an alias to /src
@Options({
  components: {
    HelloWorld,
  },
})
export default class Home extends Vue {
  print() {
    const helloRef = this.$refs.helloRef;
    console.log("helloRef.msg: ", helloRef.msg); 
  }
  mounted() {
    this.print();
  }
}
</script>


因为 this.$refs.helloRef 是未知的类型,会报错误提示:


微信图片_20220513163318.png


做个类型断言即可:



微信图片_20220513163318.png

print() {
    // const helloRef = this.$refs.helloRef;
    const helloRef = this.$refs.helloRef as any;
    console.log("helloRef.msg: ", helloRef.msg); // helloRef.msg:  Welcome to Your Vue.js + TypeScript App
  }


但是类型断言为 any 时是不好的,如果知道具体的类型,写具体的类型才好,不然引入 TypeScript 冒似没什么意义了。


9. 显式泛型


$('button') 是个 DOM 元素选择器,可是返回值的类型是运行时才能确定的,除了返回 any ,还可以


function $<T extends HTMLElement>(id: string): T {
    return (document.getElementById(id)) as T;
}
// 不确定 input 的类型
// const input = $('input');
// Tell me what element it is.
const input = $<HTMLInputElement>('input');
console.log('input.value: ', input.value);


微信图片_20220513163358.png


微信图片_20220513163407.png


函数泛型不一定非得自动推导出类型,有时候显式指定类型就好。


10. DeepReadonly


readonly 标记的属性只能在声明时或类的构造函数中赋值。


之后将不可改(即只读属性),否则会抛出 TS2540 错误。


与 ES6 中的 const 很相似,但 readonly 只能用在类(TS 里也可以是接口)中的属性上,相当于一个只有 getter 没有 setter 的属性的语法糖。


下面实现一个深度声明 readonly 的类型:


type DeepReadonly<T> = {
  readonly [P in keyof T]: DeepReadonly<T[P]>;
}
const a = { foo: { bar: 22 } }
const b = a as DeepReadonly<typeof a>
b.foo.bar = 33 // Cannot assign to 'bar' because it is a read-only property.ts(2540)


微信图片_20220513163439.png

相关文章
|
数据采集 机器学习/深度学习 数据可视化
数据科学项目实战:完整的Python数据分析流程案例解析
【4月更文挑战第12天】本文以Python为例,展示了数据分析的完整流程:从CSV文件加载数据,执行预处理(处理缺失值和异常值),进行数据探索(可视化和统计分析),选择并训练线性回归模型,评估模型性能,以及结果解释与可视化。每个步骤都包含相关代码示例,强调了数据科学项目中理论与实践的结合。
1727 2
|
1月前
|
缓存 人工智能 自然语言处理
阿里云Qwen3.7-Plus限时优惠:8折起,输入1.6元/每百万tokens,输出6.4元/每百万tokens
Qwen3.7-Plus是通义千问面向智能体时代的高性价比多模态基座模型,具备"看、想、写、做、验"端到端能力,支持视觉界面解析、代码生成、办公自动化等场景,已在猎聘、波司登、富滇银行等行业落地。当前限时8折,输入低至1.6元/百万tokens,输出6.4元/百万tokens;叠加全模型通用抵扣计划可低至4.5折,是企业构建AI智能体兼具性能与成本的理想之选。
|
3月前
|
安全 API
敏感词过滤-文本审核-敏感词审核-违禁词审核-敏感词检测-违禁词检测
本服务提供智能文本审核,精准识别违禁词、色情低俗、恶意推广、辱骂攻击及低质灌水内容,并校验广告法合规性,适用于评论过滤、注册信息筛查、文章发布等场景,保障内容安全与平台合规。
820 1
|
11月前
|
存储 Java 数据库
如何开发人事及OA管理系统的会议管理板块?(附架构图+流程图+代码参考)
人事及OA系统是现代企业管理的重要工具,整合人力资源与办公流程,提升效率。其会议管理板块可优化会议室预约、冲突检测、审批流程及数据统计,助力企业高效协作。本文详解功能设计、开发技巧与实现方案。
|
8月前
|
传感器 运维 监控
中小容量电力设备选型指南:计量型免维护呼吸器的核心价值
针对35kV-500kV中小容量变压器等设备,计量型免维护呼吸器集成高效吸湿、实时监测与智能预警功能,标配工业显示屏与RS485通讯,支持远程监控与系统接入,实现防潮运维从“被动处置”到“主动防控”升级,适配多种环境与协议,降低运维成本,提升供电可靠性。(239字)
357 0
|
10月前
|
数据采集 网络协议 API
协程+连接池:高并发Python爬虫的底层优化逻辑
协程+连接池:高并发Python爬虫的底层优化逻辑
|
机器学习/深度学习 自然语言处理 PyTorch
精通 Transformers(一)(2)
精通 Transformers(一)
752 4
|
JSON 数据格式 Python
X86架构属于国产化架构吗
在信息时代,处理器架构至关重要。本文通过简单流程和代码示例,帮助初学者理解X86架构是否属于国产化架构。首先明确国产化架构指本土研发的处理器架构,如龙芯、飞腾等。X86架构由Intel设计,主要由外资公司开发,通常不被视为国产架构。文章提供了一个判断X86架构是否国产化的流程图,并用Python代码实现判断过程。Architecture类描述架构来源和类型,App类负责获取和判定架构信息。通过这些步骤,初学者可以更好地掌握相关知识并提升开发技能。
1425 5
|
存储 关系型数据库 MySQL
|
新能源 Java Linux
你必须掌握的常用正则表达式大全
你必须掌握的常用正则表达式大全
2888 1
你必须掌握的常用正则表达式大全