感受typescript定义变量和数据类型的神奇魔力

你的Javascript能力到达瓶颈?那是因为你还不会typescript。掌握TS,让你的开发更加准确简洁。
今天的学习中,我们接着从TS的数据类型和变量入手,感受它们的奇妙魔力。
一. 变量声明方式
1.1. 声明变量的格式

我们已经强调过很多次,在TypeScript中定义变量需要指定 标识符 的类型。

所以完整的声明格式如下:

var/let/const 标识符: 数据类型 = 赋值;

比如我们声明一个message,完整的写法如下:

注意:这里的string是小写的,和String是有区别的
string是TypeScript中定义的字符串类型,String是ECMAScript中定义的一个类

let message: string = "Hello World";

message = "Hello TypeScript"; // 正确的做法
message = 20; // 错误的做法,因为message是一个string类型

1.2. 声明变量的关键字

在TypeScript定义变量(标识符)和ES6之后一致,可以使用var、let、const来定义:

var myname: string = "abc";
let myage: number = 20;
const myheight: number = 1.88;
但是,我们会发现使用var关键字会有一个警告:

   var关键字警告

可见,在TypeScript中并不建议再使用var关键字了,主要原因和ES6升级后let和var的区别是一样的,var是没有块级作用域的,会引起很多的问题,这里不再展开探讨。

所以,在之后的开发中,我们定义变量主要使用let和const

1.3. 变量的类型推断

在开发中,有时候为了方便起见我们并不会在声明每一个变量时都写上对应的数据类型,我们更希望可以通过TypeScript本身的特性帮助我们推断出对应的变量类型:

let message = "Hello World";

上面的代码我们并没有指定类型,但是message实际上依然是一个字符串类型:
Image02

给message赋值一个number
这是因为在一个变量第一次赋值时,会根据后面的赋值内容的类型,来推断出变量的类型:

上面的message就是因为后面赋值的是一个string类型,所以message虽然没有明确的说明,但是依然是一个string类型

let message = "Hello World"; // string类型
let age = 20; // number类型
let isFlag = true; // boolean类型

1.4. 声明name报错

我们在TypeScript的文件中声明一个name(很多其他的名字也会)时,会报错:
image03

声明name报错信息
主要错误信息:

无法重新声明块范围变量“name”
我们前面明明(明明说管我什么事)没有声明name,但是却说我们重复声明了

这次是因为我们的typescript 将 DOM typings 作为全局的运行环境;
所以当我们声明 name时, 与 DOM 中的全局 name 属性出现了重名;

image04

name的声明位置
如何解决这个问题呢?

有两种方案:去掉 DOM typings 的环境和声明模块
方式一:删除DOM typings的环境

但是这种办法对于我们来说并不合适,因为我们依然希望在DOM下编译我们的TypeScript代码
image05

删除DOM typing

方式二:声明我们的ts文件为一个模块

既然与全局的变量出现重名,那我们将脚本封装到模块(module)中,因为模块有属于自己的作用域,就不会和全局的产生冲突:

在 Typescript 中,我们可以使用ES6的export来导出一个对象,并且该文件被视为 module
let name = "coderwhy";

export {};
1.5. console.log报错

另外为了测试方便我们经常使用console.log来进行测试,但是使用时会报一个警告:

console.log警告
这个时候,我们可以配置
image06

配置tslint
"no-console": false

二. JavaScript数据类型
2.1. number类型

数字类型是我们开发中经常使用的类型,TypeScript和JavaScript一样,不区分整数类型(int)和浮点型(double),统一为number类型。

// 1.数字类型基本定义
let num = 100;
num = 20;
num = 6.66;
如果你学习过ES6应该知道,ES6新增了二进制和八进制的表示方法,而TypeScript也是支持二进制、八进制、十六进制的表示:

// 2.其他进制表示
num = 100; // 十进制
num = 0b110; // 二进制
num = 0o555; // 八进制
num = 0xf23; // 十六进制
2.2. boolean类型

boolean类型只有两个取值:true和false,非常简单

// boolean类型的表示
let flag: boolean = true;
flag = false;
flag = 20 > 30;
2.3. string类型

string类型是字符串类型,可以使用单引号或者双引号表示:

注意:如果打开了TSLint,默认情况下推荐使用使用双引号
// string类型表示
let message: string = "Hello World";
message = ‘Hello TypeScript‘;
同时也支持ES6的模板字符串来拼接变量和字符串:

const name = "why";
const age = 18;
const height = 1.88;

const info = my name is ${name}, age is ${age}, height is ${height};
console.log(info);
2.4. array类型

数组类型的定义也非常简单,有两种方式:

但是TSLint会推荐我们使用上面这种方式
const names1: string[] = ["why", "abc", "cba"];
const names2: Array<string> = ["why", "abc", "cba"];
2.5. object类型

object对象类型可以用于描述一个对象:

// object类型表示
const myinfo: object = {
name: "why",
age: 20,
height: 1.88,
};
但是上面的代码会报一个警告:

image07

object定义后警告
这是因为TSLint建议我们所有的key按照字母进行排序,但是这个并不是特别有必要,我们还是可以关闭掉:

image08

关闭TSLint字母排序
"object-literal-sort-keys": false
属性是不可以访问的

如果我们访问myinfo中的属性,会发现报错:

image09

找不到name属性
这是因为TypeScript并不知道某一个object类型上面就有一个name的属性。

但是如果我们让它是类型推断的,就可以正常的访问:

这是因为推导出来的类型,是如下的类型
image10

myinfo的类型
还有一种方法是定义后面会学到的接口,TypeScript一个非常好用的特性就是接口interface,后续我们会进行非常详细的学习

2.6. symbol类型

在ES5中,如果我们是不可以在对象中添加相同的属性名称的,比如下面的做法:

const person = {
identity: "程序员",
identity: "老师",
}
通常我们的做法是定义两个不同的属性名字:比如identity1和identity2。

但是我们也可以通过symbol来定义相同的名称,因为Symbol函数返回的是不同的值:

const s1 = Symbol("identity");
const s2 = Symbol("identity");

const person = {

};
这是Symbol的一个用法,更多其他用法大家可以自行学习,或者等到后续确实需要用到时,我们再详细讲解。

2.7. null和undefined

在 JavaScript 中,undefined 和 null 是两个基本数据类型。

在TypeScript中,它们各自的类型也是undefined和null,也就意味着它们既是实际的值,也是自己的类型:

const n: null = null;
const u: undefined = undefined;
三. TypeScript数据类型
?TypeScript在原有的JavaScript基础上引入了很多好用的类型:enum枚举类型、tuple元组类型、any类型、void类型、never类型等”
3.1. enum类型

3.1.1. 枚举的基本定义

枚举类型在很多语言都有的类型,比如C++、Java等等,并且也非常好用,所以TypeScript引入了enum类型,让我们开发更好的方便和安全。

枚举类型通常是定义一组数据:

enum Direction {
EAST,
WEST,
NORTH,
SOUTH,
}

const d1 = Direction.EAST;
const d2 = Direction.NORTH;
3.1.2. 枚举类型的值

枚举类型有自己的值,比如打印上面的d1和d2
image11

打印d1和d2结果
默认情况下,枚举中的数据是从0开始的,我们可以改变它的初始化值,比如下面的代码:

enum Direction {
EAST = 10,
WEST,
NORTH,
SOUTH,
}

const d1 = Direction.EAST;
const d2 = Direction.NORTH;

console.log(d1); // 10
console.log(d2); // 12
也可以全部自己来指定:

enum Direction {
EAST = 10,
WEST = 20,
NORTH = 30,
SOUTH = 40,
}

const d1 = Direction.EAST;
const d2 = Direction.NORTH;

console.log(d1); // 10
console.log(d2); // 30
我们也可以通过对应的值去获取对应的数据名称:

console.log(Direction[10]); // EAST
console.log(Direction[30]); // NORTH
3.2. tuple类型

3.2.1. tuple的基本使用

tuple是元组类型,很多语言中也有这种数据类型,比如Python、Swift等。

const tInfo: [string, number, number] = ["why", 18, 1.88];
const item1 = tInfo[0]; // why, 并且知道类型是string类型
const item2 = tInfo[1]; // 18, 并且知道类型是number类型
3.2.1. tuple和数组类比

初学tuple会觉得它和数组非常相似

但是数组中通常会定义一组相同的数据,如果数据不同会造成类型的丢失:

注意:这里我使用了一种联合类型,后面会讲到
const aInfo: Array<string|number> = ["why", 18, 1.88];
const itema = aInfo[0]; // why,但是并不知道itema是string类型还是number类型
3.3. any类型

在某些情况下,我们确实无法确定一个变量的类型,并且可能它会发生一些变化,这个时候我们可以使用any类型(类似于Dart语言中的dynamic类型)

let a: any = "why";
a = 123;
a = true;

const aArray: any[] = ["why", 18, 1.88];
3.4. void类型

void类型通常用于函数没有返回值时来使用:

首先我们需要说明的是,在TypeScript中函数也是有类型的
下面的函数,虽然我们没有指定它的类型,但是它会通过类型推导出来:

const sum = (num1: number, num2: number) => {
return num1 + num2;
};

// 相当于下面的写法
const sum: (num1: number, num2: number) => number = (num1: number, num2: number) => {
return num1 + num2;
};
image12
sum函数的类型
如果一个函数没有返回值,那么它的返回值类型就是void

我们可以将null和undefined赋值给void类型,也就是函数可以返回null或者undefined
const sayHello: (name: string) => void = (name: string) => {
console.log("hello " + name);
};
3.5. never类型

never类型表示一种从来不会存在的值的类型,有点绕,我们来这样理解:

如果一个函数中是一个死循环,那么这个函数会返回东西吗?不会,那么写void类型或者其他类型作为返回值类型都不合适,我们就可以使用never类型。
如果一个函数是抛出一个异常,那么这个函数是不是也没有返回值呢?这个时候我们也可以使用never类型。
image13
死循环的函数
image14
抛出异常的函数
?备注:所有内容首发于公众号Flutter、TypeScript、React、Node、uniapp、小程序开发、数据结构与算法等等,也会更新一些自己的学习心得等,欢迎大家关注。
编程领域要走的路还很长,决不能满足于当前的现状而停滞不前。其实你静下心来思考一番,你会发现这其中还有很多未探索的奥秘等待的发现,前路也充满着趣味。如果你对此产生浓厚的兴趣,那就接着跟我一起在这个领域中散发光芒。

原文地址:https://blog.51cto.com/13007966/2452440

时间: 2024-08-09 23:41:25

感受typescript定义变量和数据类型的神奇魔力的相关文章

关于typescript之定义变量和数据类型那点事

JavaScript虽说深受万千程序员喜爱,却有着对于企业大规模开发很难管理的缺陷.这时候,TypeScript的优势便体现出来.接下来,我们会先接触在TypeScript中定义变量相关的问题.之后再来了解JavaScript类型在TypeScript中的变化以及TypeScript中新增的类型.希望这些内容可以帮助你对typescript更加了解. 一. 变量声明方式1.1. 声明变量的格式 我们已经强调过很多次,在TypeScript中定义变量需要指定 标识符 的类型. 所以完整的声明格式如

3.typescript定义变量

在JavaScript中使用var定义变量,但是在typescript中定义变量推荐使用let ,let声明的变量只在其所在的代码块内有效 1.要想正常使用let的前提:在.ts文件最上面添加(严格模式)  "use strict"; 2.let声明的变量只在其块级作用域内生效 会报以下错误  说找不到a这个变量 3. for循环应用场景 var定义变量时,for循环在正常的情况下是可以正常输出的 但当for循环内出现闭包函数的时候就全部输出最后一个值(原理见 js->闭包循环问

3.变量与数据类型

回顾上章 我们知道了如何编写第一个java应用程序,可是离真正的应用程序开发,我们还需要学习更多的知识 从此篇开始,我们开始学习java更多知识吧 关键字 什么是关键字 具体特殊作用的单词,由jdk内定的 保留关键字(goto,const),指的是现在版本不用,新的JDK版本中可能会用 关键字的分类 1) 关键字的作用 特殊作用(比如:class可以用来定义类) 如何使用关键字 每个关键字有其特定的用法(死记便可)[如class 类名{} 这样就定义了一个类 标识符 什么是标识符 给类,接口,方

Oracle之PL/SQL编程_数据类型与定义变量和常量

-----------------------------------基本数据类型----------------------------------- 1.数值类型 NUMBER(P,S) 参数 P 表示精度,参数 S 表示刻度范围. 精度是指数值中所有有效数字的个数,而刻度范围是指小数点右边小数位的个数. "子类型" 是与 NUMBER 等价的类型别名. 子类型:DEC.DECIMAL.DOUBLE.INTEGER.INT.NUMERIC.SMALLINT.BINARY_INTEG

2018-07-14Java基础+基本数据类型+自动/强制数据类型转换+定义变量+运算符

Java查看版本: CMD内输入:java –version回车! 企业内一般是JDK1.5-->1.7版本! ① J2SE:Java 2 Platform Standard Edition( 2005年之后更名为Java SE )!包含构成Java语言核心的类:比如数据库连接,接口定义,数据结构,输入/输出,网络编程! ② J2EE:Java 2 Platform Enterprise Edition ( 2005年之后更名为Java EE )!Enterprise Edition(企业版)包

.net开发环境的认识,控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印 两种数据类型,整形类型转换

首先感谢向立凯老师带我走进.net这个很好的软件开发程序.通过两天的学习在这个领域的了解也多了很多,让大家先了解一下c#语言 c#是一种全新且简单.安全.快捷面向对象的程序设计语言.是专门为.net应用开发的语言..net的开发都基于一个统一的开发环境 Visual Studio.net.下面我们来看看怎么在Visual Studio.net.下创建以新的项目: 1.打开 2.新建一个项目 通过执行文件-新建-项目菜单命令,会弹出一个新建项目对话框.在这个对话框中选择开发语言为c#,选择框架版本

【PHP内核学习】变量和数据类型

|=-----------------------------------------------------------------------=| |=---------------------=[ PHP内核中的变量和数据类型]=--------------------=| |=-----------------------------------------------------------------------=| |=--------------------------=[ by

轻松学习JavaScript五:JavaScript的变量和数据类型

对于一们编程语言,肯定包含变量和数据类型.今天我们就来看看JavaScript脚本语言的变量和数据类型.相对 于其他的Java,C++等高级程序语言,JavaScript显得很简单. 一变量 JavaScript的变量是松散类型的,所谓松散就是用来保存任何类型的数据.变量是存储信息的容器.定义变量时 要使用var操作符(var是关键字),后面跟一个变量名(变量名是标识符).变量也就是初始化后可以再次改变的量. 那么我们来看看实例: <span style="font-size:18px;&

【2017-2-17】C#基础-定义变量,输入输出

主要学习内容为: 控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印两种数据类型,整型类型转换 编程语言文件名后缀为.cs 创建程序项目的步骤: 文件--新建--项目--Visual C#--.Net Framework 4--控制台应用程序--设置名称和位置--确定 解决方案资源管理器可以设置编写或启动某个项目 main函数中编写代码 打印内容: //往外输出内容的Console.WriteLine("输出的内容");    换行Console.Write(&q