Typescript的基本数据类型(一)

最新的ECMAScript标准定义了8中数据类型:

  • 7种原始类型:
    • Boolean
    • Null
    • Undefined
    • Number
    • Bigint
    • String
    • Symbol
  • 和 Object

除 Object 以外的所有类型都是不可变的 (值本身无法被改变》。例如,与C语言不同JavaScript 中字符串是不可变的 (译注: 如,JavaScript 中对字符串的操作一定返回了一个新字符串,原始字符串并没有被改变)。我们称这些类型的值为“原始值”。

那么我们来实验一下,在ts文件中定义数据类型。

先测试一下布尔类型的数据:

我们在ts中定义变量的时候,是用 冒号来赋值的

然后我们定义一个布尔类型的值,并给他赋值一个数字,此时就可以看到,ts中自动提示报错,这就是ts与js的其中一个明显的区别。

我们接着来定义一下其他类型的数据

当我们声明了一个常用的变量name的时候,会提示报错

 如何解决无法重新声明块范围变量“name”

1、首先我们应该先分析原因

在该文件夹下并没有其他的文件,就不用说出现name这个变量已经定义过的情况,怎么就出现了这个报错呢,非常困惑。

查阅资料后发现,在ts中会有这样的情况:

在默认状态下,typescriptDOM typings 作为全局的运行环境,所以当我们声明 name时, 与 DOM 中的全局 window 对象下的 name 属性出现了重名。因此,报了 无法重新声明块范围变量“name”. 错误。

2、解决方法

法一:

将运行环境由 DOM typings 更改成其他运行环境。我们可以在 tsconfig.json 中的compilerOptions中做一下声明:

    "lib": [
      "es2015"
    ], 

 保存之后,报错就消失了。

 法二:

既然与全局的变量出现重名,那我们将脚本封装到模块(module)内。module 有自己的作用域,自然不会与全局作用域的变量产生冲突。

在 Typescript 中,只要文件存在 import 或 export 关键字,甚至不需要返回值,都可以被视为 module

 知道了这个原理之后,我们就可以在ts文件中最后一行添加export:{} 即可。

加完之后我们可以看到对应js文件编译的时候,就会自动添加编译为commonjs模块的代码

原理就是:我们在tsconfig.js中可以看到,配置的module:commonjs。就代表编译的结果使用的就是commonjs的标准。具体原理参考博客:TS学习(六) :TS的模块化使用_井底的蜗牛的博客-CSDN博客_object.defineproperty(exports, '__esmodule', { val

 最终这样添加一行export 之后name就不会报错了、

定义原始数据类型:

// Boolean
let flag: boolean = false
// Number
let age: number = 10
// String
let name: string = 'suohhh'
let msg: string = `hello,${name}` //模板字符串
// Null
let u: null
// Undefined
let n: undefined
/**
 * 注意:undefined和null是所有类型的子类型
 * 也就是说undefined类型的变量可以赋值给number类型的变量
 * */
let num: number = undefined

export {
};

注意:如果变量的声明和赋值是同时进行的,TS可以自动对变量进行类型检测 ,例如let flag: boolean = false 可以直接写为 let flag = false,不需要再去定义类型。

这时候就有人问,那这样的话不是又回到js最初的写法,这样的类型定义是不是有些鸡肋?

答:其实类型给我们造成巨大的困扰往往不是变量,而是函数。

举例说明:

例如下面的求和函数,在 js中函数是不考虑参数的类型和个数的,那当我们传正确的数字类型是可以得到一个正确答案的,那当我们传一个字符串就会出现第二种结果,造成字符串的拼接,此时在js中也不会报错,这样就可能会导致一连串的错误,也不好排查。

当然有了ts之后这种问题基本就不算问题了。所以ts的类型定义限制主要针对的还是函数中参数或者返回值的严格性。

 修改:将参数做类型限制,此时传字符串就会爆红,方便我们预先处理

返回值也可以指定类型:

 

定义联合数据类型: 

使用符号或 | 来对变量进行多个类型的声明限制

问题来了。如果我们在定义未知的用户输入,无法确定它是什么数据类型的时候,怎么办呢?这时候一个叫 Any 的数据类型 就来救场了

定义any数据类型

从字面上看,它的意思就是代表任何,允许赋值为任意类型,

一个变量设置为any后相当于对该变量关闭了TS的类型检测、

// Any --显式any
let notSure: any = 4
notSure = 'string'
notSure = true

//当我们不设置类型,ts会自动检测为any类型
let d; //d为any类型 --隐式any

 注意:如果明确知道类型,尽量不要用any类型,因为该类型可以任意调用属性和方法都不会报错,极有可能出现问题,也就丧失了类型检查的作用。

定义unknown数据类型

unknown表示未知类型的值

和any啥区别呢?

看下面的定义方式好像没啥区别都可以定义各种不同的数据类型

下面我们分别定义一个d为any类型,以及e为unknown类型

 区别:

定义一个string类型的s,当我们把any类型的d赋值给s时是不会报错的。

当把unknown类型的e赋值给s就会报错

 总结:

         unknown实际上就是一个类型安全的any

         unknown类型的变量,不能直接赋值给他变量 

那如果我们就想将unknown类型的数据赋值给另外一个变量呢?

两种方式:

 (1)做类型检查,告诉ts当我是string类型的时候再赋值

 (2)类型断言,可以用来告诉解析器变量的实际类型

        语法: 变量 as 类型  或者  <类型>变量 

 void和never数据类型

用于函数返回值类型的设置

例如一个函数没有返回值,就用void,表示空:

这时再写个return值就会报错,可以写单个return; 或者return null; return undefined;

 never表示永远不会返回结果,连空都不会返回

 例如,用于抛出一个错误

总结,前面八种类型就已经描述完了,下面文章再具体讲解后三种数据类型:

注意:字面量类型就相当于常量,定义了一个值之后不可改变。

猜你喜欢

转载自blog.csdn.net/qq_41579104/article/details/129064368