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 前端开发
【TypeScript技术专栏】TypeScript在大型项目中的实践与挑战
【4月更文挑战第30天】TypeScript在大型前端项目中日益流行,以其类型系统和ES6+支持提升代码安全与维护性。然而,采用 TypeScript 面临学习曲线、构建时间增加及类型推断挑战。通过最佳实践和成熟工具链(如 tsc、tslint 和 Visual Studio Code)可克服这些问题。案例如Angular、Basecamp和Slack已成功应用TypeScript。掌握TypeScript对提升开发者技能和市场竞争力至关重要。
|
2月前
|
设计模式 JavaScript 安全
【TypeScript 技术专栏】TypeScript 性能优化与代码质量提升
【4月更文挑战第30天】探索 TypeScript 性能优化与代码质量提升:合理使用类型注解,减少不必要的类型断言,优化模块导入,避免过度封装;遵循编码规范,加强注释,运用设计模式,进行代码审查。在追求性能与质量间找平衡,通过案例分析实践优化策略,持续提升项目体验与可持续发展。一起打造优质 TypeScript 项目!
|
2月前
|
存储 JavaScript API
TypeScript 中类型转换的终极指南:从零到深入
TypeScript 中类型转换的终极指南:从零到深入
|
2月前
|
JavaScript 前端开发 编译器
10分钟让你吃透 《TypeScript》 函数
TypeScript提供了丰富的函数类型定义方式,可以对函数参数、返回值进行类型注解,从而提供了更为强大的类型检查。
|
2月前
|
JavaScript 前端开发 安全
推荐12个值得学习的TypeScript宝库!
推荐12个值得学习的TypeScript宝库!
|
2月前
|
JavaScript
【TypeScript学习】—TypeScript开发坏境搭建(一)
【TypeScript学习】—TypeScript开发坏境搭建(一)
|
9月前
|
JavaScript 前端开发 数据安全/隐私保护
软件开发入门教程网之TypeScript 类
软件开发入门教程网之TypeScript 类
|
11月前
|
JavaScript 索引
TypeScript深度剖析:TypeScript 中高级类型的理解?有哪些?
TypeScript深度剖析:TypeScript 中高级类型的理解?有哪些?
66 0
|
JavaScript
学习TypeScript 加餐环节
这个类型是跟原型链有关的原型链顶层就是Object,所以值类型和引用类型最终都指向Object,所以他包含所有类型。
64 0
学习TypeScript 加餐环节
|
JavaScript 前端开发 数据安全/隐私保护
软件开发入门教程网之TypeScript 类
TypeScript 是面向对象的 JavaScript。 类描述了所创建的对象共同的属性和方法。 TypeScript 支持面向对象的所有特性,比如 类、接口等。