本节内容预览
这篇文章,主要会接受下面几个的主要知识点:
- TS 类型定义的基础用法;
- 类型断言;
- JS已有类型的定义;
- TS自己的新基本类型;
- 字面变量和元组;
基础中的基础,了解这些,才能真正开始用TypeScript。
TypeScript的基础用法
我们先来看下 TypeScript(下文简称TS) 中的基础赋值语句:
// TS 赋值语句
let hello: string = 'Hello World!';
对比 JS 的赋值语句:
// JS 赋值语句
let hello = 'Hello World!';
我们可以注意到多了一个 : string
,这个就是最基础的一个变量类型声明。这个例子里,就把 my
的类型声明为了 字符串, 和后面的实际值是相符合的。**
类型断言
什么是类型断言?
类型断言就是提出来这么早,和基础用法放一起,因为其实它就是对 变量使用时 断定类型的方法
先来个报错的例子~
// 联合类型,可以看第二小节,这里表示 my 变量可能是 字符串或者数组
let my: string|number;
if (my.length) {} // 报错:类型“string | number”上不存在属性“length”。
报错是预期内的,我们都知道 number 上没有 length 属性
再来个不报错的例子:
let my: string|number;
if ((<string>my).length) {} // 不报错了
注意到差别了么, <string>my
就是这个多出来的尖括号内容了,通过它告诉 TS,这里 my 这个变量是一个string,自然不报错了,大家也能想到, 这个断言将会很有用。
断言的写法
断言有2种写法:
<string>my
my as string
使用时往往需要 用 ()
包括,已正确标记使用的内容。
但是有没人好奇为什么有2种写法,作用确完全一样?
铛铛铛, 答案就是 JSX , as 的写法就是为了更好的使用在 JSX 中。
TS 对 JS 已有类型的定义
string
字符串number
数字x[]
和Array<x>
数组object
对象null
undefined
symbol
这几个类型相对比较好理解,都是对JS中已有类型的定义,只要熟悉JS的同年,基本都能直接理解其中的意义了。
TS 新提出的基本类型
TS在上面几种类型定义意外以为,根据实际需求,还提出了以下几种新的类型:
any
- void
- never
- enum
Any
就是可能是任意值,看上去很有用、很万能,完美的避免各种TS报错。
但是 完美的避免各种TS报错** **<- 这是错误的思考方式, Any 应该尽可能少的使用,或者只用于临时, 尽可能的让TS校验类型,提早发现问题才是使用它的意义。
**Void
它表示没有任何类型。这个解释可不好理解。
但是我们可以看下面的例子,了解下它最常见的出现场景
函数 helloWorld 的返回值是 void , 确实它没有返回值, 根本没有 return。往往用于提示函数调用者, 不需要获取函数返回 ,因为根本不会有。function helloWorld(): void { console.log('Hello World!') }
最常见的例子应该是, setter 了,我们来看下
let o = {};
Object.defineProperty(o, 'a', {
set: function (newValue: string): void {
// ...
}
});
o.a = 'xxx';// 这个绝对不会有返回值,不是吗
void 和 undefined 的小注意事项
有同学会提问:“那 void 和 undefined 有什么区别吗?”
记住下面几点吧
- undefined 既是类型也是值,void 只是类型;
- 类型为 void 的变量,其值可以为 null 或者 undefined;
- 返回值类型为 undefined 的函数,必须得出现 return;
Never
这个 Never 你很可能 99% 的情况下都用不到它。
它用来表示那些永不存在的值的类型,怎么理解呢?来看个例子:
function error(message: string): never {
throw new Error(message);
}
看这个官网上的例子,就能明白,这个函数直接报错了,所以 不会进入到返回的流程,更不用提返回值了。同学们估计也就理解了为什么会说有 99% 的情况下不用用到了~
Enum 枚举
为什么最后提枚举.. 因为它太特殊了,但作者还想想简化成一个等式来理解
enum Color {Red = 1, Green = 2, Blue = 4};
约等于 ≈≈≈
const Color: { Red: 1, Green: 2, Blue: 4 } = { Red: 1, Green: 2, Blue: 4}
虽然 enum 拥有更能多能力,比如自增,但是这样不就一下能理解了么~
字面量类型及元组 Tuple
字面量和元组怎么就放到一起了呢?
来看一下几个例子
// 字符串 和 字符串字面量
let color: string = 'red';
let red: 'red' = 'red';
// 数字 和 数字字面量
let count: number = 10;
let one: 1 = 1;
// 数组 和 元组
let arr:string[] = ['a','b'];
let arr2: [string, number] = ['a', 1];
// 对象
let square:object = { width: 10, color: 'red' };
let square:{ width: number, color: string } = { width: 10, color: 'red' };
这几个是不是很接近?
都不需要太多说明了呢,
- 字符串字面量是 指定内容 的字符串类型;
- 数字字面量是 指定内容 的数字类型;
- 元组就是 指定内容 的数组类型了,指定了第一个元素是什么,第二个元素是什么… 以此类推;
- 对象也是可以 指定内容 的,但是官网默认我们都会;
本文总结
本篇文章内容虽然很多,但是基本都是一些最常用的知识点,也是开始写TS前必须掌握的内容,必须得了解清楚哦,要不然写起来肯定会磕磕碰碰的。