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

相关文章
|
1月前
|
JavaScript 前端开发 IDE
深入理解TypeScript:提升JavaScript开发的利器
【10月更文挑战第8天】 深入理解TypeScript:提升JavaScript开发的利器
28 0
|
2天前
|
JavaScript 前端开发 安全
掌握TypeScript:提升JavaScript开发质量
本文介绍了TypeScript如何通过其静态类型系统、面向对象特性及对现代JavaScript特性的支持,提升JavaScript开发的质量,包括减少错误、增强代码可维护性和利用类型推断等功能,适用于大型项目开发。
|
2月前
|
JavaScript 前端开发 架构师
软件工程师,TypeScript值得你拥有
软件工程师,TypeScript值得你拥有
39 9
软件工程师,TypeScript值得你拥有
|
1月前
|
传感器 JavaScript 前端开发
深入理解TypeScript:提升JavaScript开发效率
【10月更文挑战第8天】深入理解TypeScript:提升JavaScript开发效率
31 0
|
6月前
|
传感器 JavaScript 前端开发
【TypeScript技术专栏】TypeScript在大型项目中的实践与挑战
【4月更文挑战第30天】TypeScript在大型前端项目中日益流行,以其类型系统和ES6+支持提升代码安全与维护性。然而,采用 TypeScript 面临学习曲线、构建时间增加及类型推断挑战。通过最佳实践和成熟工具链(如 tsc、tslint 和 Visual Studio Code)可克服这些问题。案例如Angular、Basecamp和Slack已成功应用TypeScript。掌握TypeScript对提升开发者技能和市场竞争力至关重要。
109 0
|
6月前
|
设计模式 JavaScript 安全
【TypeScript 技术专栏】TypeScript 性能优化与代码质量提升
【4月更文挑战第30天】探索 TypeScript 性能优化与代码质量提升:合理使用类型注解,减少不必要的类型断言,优化模块导入,避免过度封装;遵循编码规范,加强注释,运用设计模式,进行代码审查。在追求性能与质量间找平衡,通过案例分析实践优化策略,持续提升项目体验与可持续发展。一起打造优质 TypeScript 项目!
175 0
|
6月前
|
前端开发 JavaScript 安全
【TypeScript技术专栏】TypeScript在微前端架构中的应用
【4月更文挑战第30天】微前端架构通过拆分应用提升开发效率和降低维护成本,TypeScript作为静态类型语言,以其类型安全、代码智能提示和重构支持强化这一架构。在实践中,TypeScript定义公共接口确保跨微前端通信一致性,用于编写微前端以保证代码质量,且能无缝集成到构建流程中。在微前端架构中,TypeScript是保障正确性和可维护性的有力工具。
71 0
|
6月前
|
JavaScript 前端开发 编译器
10分钟让你吃透 《TypeScript》 函数
TypeScript提供了丰富的函数类型定义方式,可以对函数参数、返回值进行类型注解,从而提供了更为强大的类型检查。
|
6月前
|
JavaScript 前端开发 安全
推荐12个值得学习的TypeScript宝库!
推荐12个值得学习的TypeScript宝库!
106 0
|
6月前
|
JavaScript
【TypeScript学习】—TypeScript开发坏境搭建(一)
【TypeScript学习】—TypeScript开发坏境搭建(一)