首页 > 其他分享 >TypeScript – Using Disposable

TypeScript – Using Disposable

时间:2023-08-28 13:12:30浏览次数:43  
标签:do TypeScript Dispose Disposable person Using dispose

前言

TypeScript v5.2 多了一个新功能叫 Disposable。

Dispose 的作用是让 "对象" 离开 "作用域" 后做出一些 "释放资源" 的操作。

很多地方都可以看到 Dispose 概念。比如 Web Component 的 disconnectedCallback,Angular 组件的 ngOnDestroy

而对象释放资源在其它面向对象语言中也很常见,比如 C# 的 Dispose Pattern

所以这一次 TypeScript 只是推出了一个本来就该有的功能而已。

之所以这么迟才推出,是因为这个功能可以用其它方式替代(虽然不够优雅),而且 Dispose 在后端比较需要,前端现在都迷函数式,对象反而越来越少见了。

 

目前的支持度

Disposable 并不是 TypeSCript 语法,而且 JavaScript ECMA 标准。目前在 stage 3

当然 TypeScript 会做 down-level 处理,target ES2017 也可以使用,只是需要添加两句 runtime polyfill 就可以了。

在我写着一篇时,PrettierESLintesbuild 都还不支持 Disposable。要测试只能用 TypeScript Compiler (AKA tsc)。

 

没有 Disposable 怎么释放资源?

首先有个对象

class Person {
  private intervalNumber: number;
  constructor() {
    this.intervalNumber = setInterval(() => console.log('call'), 1000);
  }
  dispose() {
    clearInterval(this.intervalNumber);
  }
}

对象用到了一个全局资源  setInterval,并曝露了一个接口释放该资源。

使用的情况下是这样的。

document.addEventListener('click', () => {
  const person = new Person();
  // do something...
  person.dispose();
});

这样写不够安全,因为如果 do something 不小心报错,就会导致 dispose 没有被执行。于是

document.addEventListener('click', () => {
  const person = new Person();
  try {
    // do something...
  } catch {
    console.log('error');
  } finally {
    person.dispose();
  }
});

繁琐了很多,但是还可以接受,毕竟需要错误处理嘛。但是...如果我们不需要错误处理呢?

document.addEventListener('click', () => {
  const person = new Person();
  // do something...
  if (Math.random() > 0.5) return;
  person.dispose();
});

即便没有错误,只是 return 也会导致 dispose 没有执行。这个时候硬硬加 try finally 就有点过分了。

所以我们需要 Disposable 来优化,让代码变得优雅。

 

有 Disposable 怎样释放资源?

 

标签:do,TypeScript,Dispose,Disposable,person,Using,dispose
From: https://www.cnblogs.com/keatkeat/p/17662020.html

相关文章

  • TypeScript – 冷知识
    当genericreturn遇上parameter 报错了。原因是querySelector默认返回类型是抽象的Element。而method参数要求的是具体的InputElement解决方法是传入具体的InputElement类型constinput=document.querySelector<HTMLInputElement>('.input')!;但这不是重点......
  • Struts2标签错误:using Struts tags without the associat解决
    <filter-mapping><filter-name>struts2</filter-name><url-pattern>*.jsp</url-pattern></filter-mapping> struts,在使用标签的时候,出现了这样一个问题。    原本使用标签,引用方法是默认配置:    web.xml:<filter><filter-name&......
  • 使用pdb调试openstack (How to debug openstack using pdb )
    终于摸索出了一个调试openstack的简单方法,使用pdb进行单步调试,对于分析代码很有帮助。注意,这个方法只适用于用devstack安装的openstack。调试主要是使用了一个脚本,这个脚本不记得是从哪下载的了,是用来重启使用devstack安装的openstack的各个服务的,后来,我又结合devstack的stack.sh和......
  • TypeScript(TS)JavaScript(JS)中的所有循环方法
    for循环:for(leti=0;i<array.length;i++){//循环体}for…of循环:for(constelementofarray){//循环体}forEach方法:array.forEach((element)=>{//循环体});map方法:constnewArray=array.map((element)=>{//对......
  • 深入理解C#中的IDisposable接口
      在开始之前,我们需要明确什么是C#(或者说.NET)中的资源,打码的时候我们经常说释放资源,那么到底什么是资源,简单来讲,C#中的每一种类型都是一种资源,而资源又分为托管资源和非托管资源,那这又是什么?!  托管资源:由CLR管理分配和释放的资源,也就是我们直接new出来的对象;  非托管资......
  • typescript 数组根据指定字段去重
    this.listDataIn=data.Result.data;constuniqueItems:Item[]=Array.from(newSet(this.listDataIn.map(item=>item.MyLandID))).map(id=>{returnobj.listDataIn.find(item=>item.MyLandID===id);});......
  • WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platfo
    问题描述使用start-dfs.sh命令开启hdfs服务时,爆出这样的警告信息问题解决可以先进入到我们下载hadoop的文件目录下,然后进入到这个文件里面:vimetc/hadoop/log4j.properties然后将下面的语句添加到问年末尾处:log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR......
  • Using 声明”在 C# 7.3 中不可用。请使用 8.0 或更高的语言版本
    Core3.0升级至3.1时候报错:“Using声明”在C#7.3中不可用。请使用8.0或更高的语言版本。解决办法:在工程.csproj文件中的<PropertyGroup>节加入<LangVersion>preview</LangVersion>即可。也可以指定具体的版本。......
  • [React Typescript] JSX.IntrinsicElements
    interfaceIntrinsicElements{//HTMLa:React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>,HTMLAnchorElement>;abbr:React.DetailedHTMLProps<React.HTMLAttributes<HTMLElemen......
  • typeScript学习-泛型
    typeScript学习泛型为什么要用泛型?泛型定义。泛型在类中的应用?封装一个面向对象的ArrayList类。泛型默认值。泛型约束。泛型在Vue3源码中的应用。exendskeyof+keyof的联合应用。泛型反向赋值。具有以下特点的数据类型叫泛型:特点一:定义时不明确使用时必须明确成某......