资讯专栏INFORMATION COLUMN

为vue3学点typescript, 基础类型和入门高级类型

Songlcy / 626人阅读

摘要:导航第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型很重要这一节很重要可以说是的最核心部分这一节学完其实就可以开始用写代码了想想中的再看看标题中的类型字所以请大家务必认真什么是入门高级类型因为高级类型的内容比较多但是有些基

导航

第一课, 体验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 = [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-...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105244.html

相关文章

  • vue3学点typescript(1), 体验typescript

    摘要:更新啦第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型要来了看了的视频特别兴奋要来了是用开发的我揣测在的带领下会成为主流呢要不先学点年最酷的前端技术我是年初开始使用的自从开始用上了就喜欢上了真的爱不释手最爱他几点很多小错误 更新啦 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 vue3要来了 看了vue ...

    Batkid 评论0 收藏0
  • vue3学点typescript, 泛型

    摘要:往期第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型插一课本来打算接着上节课把高级类型都讲完但是写着写着我发现高级类型中有很多地方都需要泛型的知识那么先插一节泛型什么是类型变量和泛型变量的概念我们都知道可以表示任意数据类型 往期 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 插一课 本来打算接着上节课, ...

    tianlai 评论0 收藏0
  • Vue3 学点 TypeScript, 什么是命名空间(namespace)

    摘要:往期目录第一课体验第二课基础类型和入门高级类型第三课什么是泛型第四课解读高级类型第五课什么是命名空间什么时候要用命名空间如果你发现自己写的功能函数类接口等越来越多你想对他们进行分组管理就可以用命名空间下面先用类举例仔细看你会发现下还有在这里 往期目录 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 什么是泛型? 第四课, 解读高级类型 第五课, 什么是命...

    greatwhole 评论0 收藏0
  • vue3学点typescript, 解读高级类型

    摘要:直达第一课体验第二课基础类型和入门高级类型第三课泛型第四课解读高级类型第五课什么是命名空间回顾第二课的时候为了更好的讲解基础类型所以我们讲解了一部分高级类型比如接口联合类型交叉类型本节课我会把剩余高级类型都讲完知识点摘要本节课主要关键词为自 直达 第一课, 体验typescript 第二课, 基础类型和入门高级类型 第三课, 泛型 第四课, 解读高级类型 第五课, 什么是命名空间(na...

    chuyao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<