TypeScript 是 JavaScript 的超集,这里我们只讨论两者中的不同的部分,或者需要注意的部分
数组 Array:在TypeScript中,有两种方式来定义一个数组:
在元素类型后面接上 [] ,表示此数组,是由该类型的元素所组成:
let list: number[] = [1, 2, 3]
使用数组泛型,意义是与第一种方式相同的
let list: Array<number> = [1, 2, 3]
总结: ts 与 js 中数组的区别在于,js 是一个弱类型的语言,所以 js 数组中的元素可以是不同类型的;但 ts 是不同的,严格意义上是不允许一个数组中的元素类型是不同的,如果非要这样做,可以将元素类型指定为 any 或者 let list: (string | number)[]
,不过这将失去严格的意义,因为数组(列表)的定义是:数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式,是用于储存多个相同类型数据的集合。
元组 Tuple:表示一个已知元素 数量、类型的数组,与数组的区别是,元组内各元素的类型不必相同。
创建一个元组:let x: [string, number] = ["hello", 123]
总结:ts 中的元组,不同于传统高级程序语言的元组的定义,首先它并不是一个“独立”的数据类型,因为使用Array.isArray(x)
返回的true;其次,其元素可以动态修改的。可以说,其在某种场景下,是对 js 数组的兼容写法。
枚举 enum:是对 js 标准数据类型的一个补充。
枚举类型的定义与取值:
`enum Sex { Male, Female }
let s: Sex = Sex[0] || let s: Sex = Sex.Male
`
总结:可以将其理解为特殊的数组,其索引值是初始时就已经定好了的,其使用场景一般是用来定义,有限取值范围的变量;如:一周只有七天,性别只有两个等等。
Any:表示任意类型,常用来在编程阶段我们还不确定这个变量的具体类型时,可以正常的通过编译,在我们弄清该变量在程序上下文中的关系后,在将其指定为具体的类型。
需要弄清楚的是: Any 与 Object 之间的区别,Object 具有与 Any 相似的作用,但它们有本质的区别,Object 类型的变量,只能够允许将其赋任何值,但不能在它上面调用任何的方法,即使它真的有这个方法也不行。
Void:表示没有任何类型,它与 Any 是有本质的区别的,它们的意义刚好相反。常用来表示一个没有任何返回值的函数的返回值类型。
function demo(): void {....}
Null 和 Undefined:它们是两种数据类型,它们分别只有一个值,就是其本身,所以将一个变量的类型指定为这两者中的任意一个都是没有意义的。只需要直接赋值即可。
Never:表示那些永远不存在的值的类型。常用来表示那些只要运行的就会抛出异常的函数的返回值类型。返回 never 的函数必须存在无法到达的终点。
类型断言:告诉编译器,“相信我,我知道我在做什么,不要给我报错了。。。。”; 相当于其它高级语言中的 类型转换。
例如:
`
let str: any = 'hello'
let len: number = (
`
另一种写法:
`
let str: any = 'hello'
let len: number = (str as string).length
`
注意:本质上,这两种写法都是被认可的,但是在 JSX 中,只有第二种写法才被允许。