当前位置: 首页 > 科技观察

Typescript 类型的本质是什么

时间:2023-03-20 23:11:05 科技观察

Typescript类型的本质是什么?转载本文请联系神光编程秘籍公众号。类型类型是指变量的类型,变量就是一块内存空间。不同类型的变量占用的字节数不同,可以执行不同的操作。Number、boolean、string等类型的变量会占用不同的内存大小。类型分为基本类型和引用类型。基本类型分配在栈上,而引用类型分配在堆上。之所以有引用类型,是因为这个类型是复合的,比如一个对象,它可能有任意多个属性。这种放在可以动态分配内存的堆上,然后在栈上记录地址。这是引用类型。类型是变量在运行时的内存空间大小和可以执行的操作的标识,但在代码中不一定包含。根据代码中是否有类型标识,语言分为静态类型语言和动态类型语言。静态类型、动态类型、类型安全动态类型语言的代码不记录变量的类型,可以对变量赋值进行任意操作。这样不考虑类型写代码比较简单,但也存在隐患,也就是在运行时给变量赋值时,发现类型不一致,或者调用了一个不存在的方法等等,这是动态类型语言的缺点。静态类型语言在代码中保存了类型标识,即有一个静态类型系统。声明变量的类型会在运行时分配相应的内存空间,赋同类型的值,调用该类型的方法。如果没有,可以在编译时检查。这种同类型的变量只赋同类型的值,只做该类型允许的操作,称为类型安全。显然,动态类型是类型不安全的,在运行时会出现各种类型相关的问题,而静态类型是通过类型系统,在编译时检查出类型不安全的操作并报错,所以它是类型安全的。Typescript在动态类型javascript的基础上增加了静态类型系统,是javascript的超集。静态类型系统的3个层次其实静态类型系统分为3个层次:纯静态类型系统第一种是纯静态类型系统,变量的类型是在定义的时候声明的,但是有遇到一个问题,参数的类型可能是多种类型时会比较麻烦。一些古老的语言就是这种。例如:intadd(inta,intb){returna+b;}doubleadd(doublea,doubleb){returna+b;}带泛型的静态类型系统第二种是带泛型的静态类型系统,泛型也叫类型参数,其具体类型可以通过泛型参数动态确定,增加了一定的灵活性。java是这个。例如:Tadd(Ta,Tb){returna+b;}支持高级类型的静态类型系统第三种是支持高级类型的静态类型系统。高级类型是生成类型的类型。泛型类型除了传递参数外,还可以支持分支、递归、属性检索等操作,通过复杂的逻辑生成类型。打字稿是这样的。例如,以下高级类型:typeRepeatN=Tuple['length']extendsN?Tuple:RepeatN;它的作用是当传入泛型参数时,返回一个重复参数n次的元组:typeres=RepeactN<'a',3>;//res为['a','a','a']高级类型支持类型编程,甚至是图灵完备,图灵完备意味着所提供的语言特性可以描述所有可计算的逻辑。也就是说,所有用javascript写的逻辑都可以用typescript中的类型来实现,只是具体语法不同而已。高级类型示例以上述重复参数n次的代码为例。如果我们使用javascript,我们会这样写:functionrepeactN(item,n){constres=[];for(leti=0;i那么具体实现就是不断的往Tuple中放入Items,递归构造RepeatN直到Tuple的长度达到NTuple['length']extendsN?Tuple:RepeatN;所以,完整的类型是这样的:这个高级类型,我们可以感受到typescript的静态类型系统是第三种类型,可以支持类型编程,实现各种复杂的逻辑,最终生成目标类型。typscript类型系统复杂的原因为什么typscript要设计这么复杂的类型系统?静态类型的目的是在编译时检查运行时行为,所以最终的类型必须在编译时确定,而javascript逻辑也很灵活,所以如果要在运行前确定类型,需要推导各种类型来生成最终类型,因此设计了一个具有高级类型的静态类型系统。typscript静态类型系统的复杂性主要是由于javascript的灵活性,这是不可避免的。总结类型本质上是一个变量在运行时的内存大小以及可以对其进行的操作。变量只是赋值相同的类型,这意味着类型安全。动态类型在源码中没有类型信息,所以无法保证类型安全,而静态类型在源码中是有类型信息的,编译时可以检查类型错误,保证类型安全。JavaScript是一种动态类型语言。虽然写代码比较简单,但是运行时很容易出现类型安全问题。Typescript是一个扩展,解决了javascript没有静态类型系统的问题。ts的类型系统是静态类型系统,支持泛型和高级类型,类型的语法是图灵完备的,即可以表达各种逻辑,但是和js中的语法不同。这也是ts扩展到js的类型系统中最复杂的部分。它被戏称为类型体操,但为了使javascript类型安全,这种复杂性是不可避免的。其实所谓的高级类型的类型体操并没有那么难,只要想清楚自己要表达的逻辑,然后使用相应的语法一步步实现即可,只是语法会有点别扭,比如变量是用泛型参数实现的,循环是用递归实现的等等,但是只要理清逻辑,实现起来也不难。