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

相关文章
|
2月前
|
JavaScript 前端开发 IDE
深入理解TypeScript:提升JavaScript开发的利器
【10月更文挑战第8天】 深入理解TypeScript:提升JavaScript开发的利器
35 0
|
1月前
|
JavaScript 前端开发 安全
掌握TypeScript:提升JavaScript开发质量
本文介绍了TypeScript如何通过其静态类型系统、面向对象特性及对现代JavaScript特性的支持,提升JavaScript开发的质量,包括减少错误、增强代码可维护性和利用类型推断等功能,适用于大型项目开发。
|
3月前
|
JavaScript 前端开发 架构师
软件工程师,TypeScript值得你拥有
软件工程师,TypeScript值得你拥有
45 9
软件工程师,TypeScript值得你拥有
|
2月前
|
传感器 JavaScript 前端开发
深入理解TypeScript:提升JavaScript开发效率
【10月更文挑战第8天】深入理解TypeScript:提升JavaScript开发效率
37 0
|
4月前
|
前端开发 JavaScript 安全
【前端开发新境界】React TypeScript融合之路:从零起步构建类型安全的React应用,全面提升代码质量和开发效率的实战指南!
【8月更文挑战第31天】《React TypeScript融合之路:类型安全的React应用开发》是一篇详细教程,介绍如何结合TypeScript提升React应用的可读性和健壮性。从环境搭建、基础语法到类型化组件、状态管理及Hooks使用,逐步展示TypeScript在复杂前端项目中的优势。适合各水平开发者学习,助力构建高质量应用。
70 0
|
6月前
|
JavaScript 前端开发 编译器
探讨TypeScript如何帮助JavaScript开发者避免这些常见错误,从而提高代码质量和开发效率
【6月更文挑战第13天】TypeScript,JavaScript的超集,通过添加静态类型检查和面向对象特性,帮助开发者避免常见错误,提升代码质量和开发效率。它能检测类型错误,防止运行时类型转变引发的问题;使用可选链和空值合并避免引用错误;通过枚举减少逻辑错误中的魔法数字;接口和泛型等特性提高代码可维护性。学习TypeScript对提升JavaScript开发质量有显著效果。
68 4
|
6月前
|
JavaScript 安全 IDE
对于大型项目,TypeScript的优势有哪些?
【6月更文挑战第1天】对于大型项目,TypeScript的优势有哪些?
52 6
|
6月前
|
JavaScript 安全 开发者
Vue3 中更好地利用 TypeScript 的类型系统来提高代码质量
Vue3 中更好地利用 TypeScript 的类型系统来提高代码质量
|
7月前
|
传感器 JavaScript 前端开发
【TypeScript技术专栏】TypeScript在大型项目中的实践与挑战
【4月更文挑战第30天】TypeScript在大型前端项目中日益流行,以其类型系统和ES6+支持提升代码安全与维护性。然而,采用 TypeScript 面临学习曲线、构建时间增加及类型推断挑战。通过最佳实践和成熟工具链(如 tsc、tslint 和 Visual Studio Code)可克服这些问题。案例如Angular、Basecamp和Slack已成功应用TypeScript。掌握TypeScript对提升开发者技能和市场竞争力至关重要。
120 0
|
7月前
|
设计模式 JavaScript 安全
【TypeScript 技术专栏】TypeScript 性能优化与代码质量提升
【4月更文挑战第30天】探索 TypeScript 性能优化与代码质量提升:合理使用类型注解,减少不必要的类型断言,优化模块导入,避免过度封装;遵循编码规范,加强注释,运用设计模式,进行代码审查。在追求性能与质量间找平衡,通过案例分析实践优化策略,持续提升项目体验与可持续发展。一起打造优质 TypeScript 项目!
190 0

热门文章

最新文章