内容简介:这一节很重要, 可以说是因为高级类型的内容比较多, 但是有些基础类型的知识点还必须要用到高级类型的知识讲解才连贯, 所以本节课把最常用的高级类型提前讲解一下, 比如
导航
第一课, 为vue3学点typescript(1), 体验typescript
很重要
这一节很重要, 可以说是 ts的最核心 部分, 这一节学完其实就可以开始用ts写代码了, 想想typescript中的 type , 再看看标题中的" 类型 "2字, 所以请大家务必认真.
什么是入门高级类型
因为高级类型的内容比较多, 但是有些基础类型的知识点还必须要用到高级类型的知识讲解才连贯, 所以本节课把最常用的高级类型提前讲解一下, 比如 接口/联合类型/交叉类型 .
基础类型
ts中 基础类型 有如下几种: boolean / number / string / object / 数组 / 元组 / 枚举 / any / undefined / null / void / never , 下面我们一一举例学习:
字面量
介绍类型前,有一个 前置知识点 就是 字面量 , 字面量的意思就是直接声明, 而非 new 关键词实例化出来的数据:
// 字面量 const n:number = 123; const s:string = '456'; const o:object = {a:1,b:'2'}; // 非字面量 const n:Number = new Number(123); const s:String = new String('456'); const o:Object = new Object({a:1,b:'2'});
通过上面的例子, 大家应该看明白为什么ts中有些类型的 开头字母是小写 的了吧. 这是因为ts中用小写字母开头的类型代表字面量, 大写的是用来表示通过 new 实例化的数据.
boolean
布尔类型, 取值只有 true
/ false
const IS_MOBILE:boolean = true; const IS_TABLE:boolean = false;
number
数字类型, 整数/小数都包括, 同时支持2/8/10/16进制 字面量 .
let decLiteral: number = 6; let hexLiteral: number = 0xf00d; let binaryLiteral: number = 0b1010; let octalLiteral: number = 0o744;
string
字符串类型
let s1:string = 'hello world!'; let s2:string = 'hello ${name}`;
数组
数组有2种表示方式:
第1种, 通过在 指定类型
后面增加 []
, 表示该数组内的元素都是该 指定类型
:
let numbers:number[] = [1,2,3,4,5]; // number|string代表联合类型, 下面的高级类型中会讲 let numbers:(number|string)[] = [1,2,3,4,'5'];
第2种, 通过泛型表示, Array<元素类型>
, 泛型
会在后面课讲解, 先做了解即可:
let numbers:Array<number> = [1,2,3,4,5];
元组(Tuple)
元组类型表示一个已知 元素数量 和 类型 的 数组 , 各元素的类型不必相同:
let list1:[number, string] = [1, '2', 3]; // 错误, 数量不对, 元组中只声明有2个元素 let list2:[number, string] = [1, 2]; // 错误, 第二个元素类型不对, 应该是字符串'2' let list3:[number, string] = ['1', 2]; // 错误, 2个元素的类型颠倒了 let list4:[number, string] = [1, '2']; // 正确
枚举(enum)
枚举是ts中有而js中没有的类型, 编译后会被转化成 对象
, 默认元素的值从1开始, 如下面的 Color.Red
的值为1, 以此类推 Color.Green
为2, Color.Blue
为3:
enum Color {Red, Green, Blue} // 等价 enum Color {Red=1, Green=2, Blue=3}
当然也可以自己手动赋值:
enum Color {Red=1, Green=2, Blue=4}
并且我们可以反向通过值得到他的键值:
enum Color {Red=1, Green=2, Blue=4} Color[2] === 'Green' // true
看下编译成js后的枚举代码, 你就明白为什么可以反向得到键值:
var Color; (function (Color) { Color[Color["Red"] = 0] = "Red"; Color[Color["Green"] = 1] = "Green"; Color[Color["Blue"] = 2] = "Blue"; })(Color || (Color = {})); // Color的值为: {0: "Red", 1: "Green", 2: "Blue", Red: 0, Green: 1, Blue: 2}
any(任意类型)
any代表任意类型, 也就是说, 如果你不清楚变量是什么类型, 就可以用any进行标记, 比如引入一些比较老的js库, 没有声明类型, 使用的时候就可以标记为any类型, 这样ts就不会提示错误了. 当然不能所有的地方都用any, 那样ts就没有使用的意义了.
let obj:any = {}; // ts自己推导不出forEach中给obj增加了'a'和'b'字段. ['a', 'b'].forEach(letter=>{ obj[letter] = letter; }); // 但是因为标记了any, 所以ts认为a可能存在 obj.a = 123
void
void的意义和 any 相反, 表示不是任何类型, 一般出现在函数中, 用来标记函数没有返回值:
function abc(n:number):void{ console.log(n); }
void类型对应2个值, 一个是undefined,一个null:
const n1:void = undefined; const n2:void = null;
null 和 undefined
默认情况下null和undefined是所有类型的子类型, 比如:
const n1:null = 123; const n2:undefined = '123';
注意:这是因为默认情况下的编译选项 strictNullChecks 为false, 但是为了避免一些奇怪的问题出现, 我还是建议大家设置为true(编译选项设置的内容, 会在后面的课程讲解), 请用精准的类型去标注.
如果一个变量的值确实需要是 null
或者 undefined
, 可以像下面这么用, ts会自动根据 if/else
推导出正确类型:
// 这是"联合类型", 在"高级类型"中会有详细介绍, 表示n可能是undefined也可能是number let num: undefined|number; if(Math.random()>0.5) num = 1; if(undefined !== num) { num++; }
never
never表示不可达, 用文字还真不好描述, 主要使用在 throw
的情况下:
function error():never{ throw '错了!'; }
object
object表示非原始类型, 也就是除 number / ss / boolean / symbol / null / undefined 之外的类型:
let o1:object = []; let o2:object = {a:1,b:2};
但是, 我们 实际上基本不用object 类型的, 因为他标注的非常不具体, 一般都用 接口 来标注更具体的对象类型, 请继续看下面的 接口 的内容.
高级类型入门
通过基础类型组合而来的, 我们可以叫他高级类型. 包含: 交叉类型 / 联合类型 / 接口 等等, 当然不止他们3个, 为了不让本节课太长造成读者疲劳, 本节只先讲这3个, 不过不要着急, 下节课会完结高级类型 .
接口(interface)
一种定义复杂类型的格式, 比如我们用对象格式存储一篇文章, 那么就可以用接口定义文章的 类型 :
interface Article { title: stirng; count: number; content:string; fromSite: string; } const article: Article = { title: '为vue3学点typescript(2), 类型', count: 9999, content: 'xxx...', fromSite: 'baidu.com' }
在这种情况下,当我们给 article
赋值的时候, 如果 任何一个字段没有被赋值
或者 字段对应的数据类型不对
, ts都会提示错误, 这样就保证了我们写代码不会出现上述的小错误.
非必填(?)
还是上面的例子, fromSite
的意思是文章来自那个网站,如果文章都是原创的, 该字段就不会有值, 但是如果我们不传又会提示错误, 怎么办?
这时候就需要标记 fromSite
字段为 非必填
, 用"?"标记:
interface Article { title: stirng; count: number; content:string; fromSite?: string; // 非必填 } // 不会报错 const article: Article = { title: '为vue3学点typescript(2), 类型', count: 9999, content: 'xxx...', }
用接口定义函数
接口不仅可以定义对象, 还可以定义函数:
// 声明接口 interface Core { (n:number, s:string):[number,string] } // 声明函数遵循接口定义 const core:Core = (a,b)=>{ return [a,b]; }
用接口定义类
先简单看下如何给类定义接口, 后面的课程具体讲类:
// 定义 interface Animate { head:number; body:number; foot:number; eat(food:string):void; say(word:string):string; } // implements class Dog implements Animate{ head=1; body=1; foot=1; eat(food){ console.log(food); } say(word){ return word; } }
交叉类型(&)
交叉类型是将多个类型合并为一个类型, 表示" 并且
"的关系,用 &
连接多个类型, 常用于对象合并:
interface A {a:number}; interface B {b:string}; const a:A = {a:1}; const b:B = {b:'1'}; const ab:A&B = {...a,...b};
联合类型(|)
交叉类型也是将多个类型合并为一个类型, 表示" 或
"的关系,用 |
连接多个类型:
function setWidth(el: HTMLElement, width: string | number) { el.style.width = 'number' === typeof width ? `${width}px` : width; }
注意: 我这里标记了el为 HTMLElement , 可以在typescript的仓库看到ts还定义了很多元素, 请自行浏览(不用背, 用的时候现查),
https://github.com/microsoft/...总结
如果您看完了上面的所有知识点, 你就可以开始动手造轮子练习了, 加油. 下面是我用ts造的轮子, 如果喜欢请帮忙点下star, 谢谢.
手势库: https://github.com/any86/any-...
命令式调用vue组件: https://github.com/any86/vue-...
工作中常用的一些代码片段: https://github.com/any86/usef...
一个mini的事件管理器: https://github.com/any86/any-...
以上所述就是小编给大家介绍的《为vue3学点typescript(2), 基础类型和入门高级类型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Redis 入门-数据类型:3 种特殊类型详解
- 入门:基础语法(二)内建变量类型
- Go语言快速入门笔记(2)--值类型和引用类型,silce切片,map映射
- 类型即正义:TypeScript 从入门到实践(序章)
- PHP入门之类型与运算符(一)
- Dart 入门 & 与 ts 类型系统的异同
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Android 源码设计模式解析与实战
何红辉、关爱民 / 人民邮电出版社 / 2015-11 / 79.00元
本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式、备忘录模式、迭代器模式、模板方法模式、访问者模式、中介......一起来看看 《Android 源码设计模式解析与实战》 这本书的介绍吧!