为 Vue3 学点 TypeScript , 体验 TypeScript

27,842 阅读5分钟

直达

第一课, 体验typescript

第二课, 基础类型和入门高级类型

第三课, 泛型

第四课, 解读高级类型

第五课, 命名空间(namespace)是什么

特别篇, 在vue3🔥源码中学会typescript🦕 - "is"

第六课, 什么是声明文件(declare)? 🦕 - 全局声明篇

第七课, 通过vue3实例说说declare module语法怎么用🦕模块声明篇

新开发vscode插件: ⚡any-type, 一键json到ts类型

vue3要来了

看了vue conf 2019的视频, 特别兴奋, vue3要来了! vue3是用typescript开发的, 我揣测在vue的带领下typescript会成为主流呢, 要不先学点.

19年最酷的前端技术

我是19年初开始使用的typescript, 自从开始用上了就喜欢上了, 真的爱不释手, 最爱他几点:

  1. 很多小错误比如: 对象的字段不存在或者字段名字拼写错误, 编辑器会在写代码的时候就提示你, 降低出低级错误的几率.
  2. 标注了类型的变量, 使用的时候编辑器都会列出变量上的方法和属性, 开发体验更舒服.
  3. 很多大神的项目都用typescript开发, 看源码的时候因为有了类型标注, 更容易理解.
  4. 让自己写的代码看起来很厉害的样子🐂.

typescript代码

我也希望更多的同行都开始用typescript, 让他成为前端涨工资的又一个工具(回想下webpack和vue给你带来什么, 最早"吃螃蟹"的人, 肯定享受最大的红利).

放几个我学习typescript过程中写的项目,自从用了typescript就特别喜欢造轮子, 写的不好, 就是有份热情, 抛砖引玉, 大家肯定能写出更好的.

手势库: github.com/any86/any-t…

命令式调用vue组件: github.com/any86/vue-c…

工作中常用的一些代码片段: github.com/any86/usefu…

一个mini的事件管理器: github.com/any86/any-e…

typescript工作原理

通过typescript命令行工具, 把typescript转成javascript, 从而支持在浏览器运行.

注: 后面的文章中typescript简称ts, javascript简称js.

typescript特性

ts和js最大的区别就是ts多了类型注解功能, 通过名字中的"type"也能看出语言的重点在"类型"上. 这个类型分为基础类型高级类型, 高级类型就是通过基础类型组成的自定义类型.

基础类型

ts中包含了boolean / number / string / object / 数组(数组的表示有多种, 后续文章会展开) / 元组 / 枚举 / any / Undefined / Null / Void / Never

any是本文的重点, 一会会对他着重讲解.

高级类型

大部分情况是对object类型做更细的标注, 此处不多讲, 先放个例子了解即可, 知道关键词interface即可, 中文名"接口", 后续章节会展开.

interface Article {
    title: string;
    count: number;
    content: string;
    tags: string[]; // 数组里的元素都是字符串
}
聪明的vscode

当我们使用vscode编辑器的时候, 编辑器会根据我们的"类型注解"进行代码提示错误提示:

类型写错了, 也会提示:

动手开始, 安装

  1. 安装nodejs
  2. 在命令行运行npm i -g typescript, 安装编译器到全局.
  3. 安装vscode编辑器.

开始写代码

生成js
  1. 建立一个文件夹, 在里面新建一个hello.ts文件, 注意扩展名是ts.
  2. vscode打开hello.ts文件.
  3. 输入如下代码, 让我们体验下ts:
interface A {
    a:number,
    b:string
}
let obj:A = {a:123,b:'456'};
  1. 命令行进入文件夹, 执行命令
npx tsc hello.ts

好了我们可以看下文件内部多了一个hello.js, 打开看看:

var obj = { a: 123, b: '456' };

代码中的"类型注解"不见了 ,我们的ts被编译成js了, 是不是很神奇.

错误提示
interface A {
    a:number,
    b:string
}
// 错误, 会提示b的类型错误, 应该为string类型
let obj:A = {a:123,b:456};

any类型

any代表任意类型, 这个类型特别适合ts新手, 初期有些类型不知道如何表达, 我们就可以暂时使用any表达, 等熟练ts后再标注精准的类型.

下面的情况新手可能就不会了, 以为n标记为number, 但是循环中i大于5的时候就是字符串了, 所以ts就会提示错误.

let n:number;
for(let i = 0;i<10;i++) {
    if(i <= 5) n = 10;
    else n = '100';
}
// ts提示: 不能将类型“"100"”分配给类型“number”

作为新手如果初期你不知道"联合类型"这个概念, 你就可以直接把n标记为any:

// 熟练后会是这么标记的 
// let n:string|number
let n:any;
for(let i = 0;i<10;i++) {
    if(i <= 5) n = 10;
    else n = '100';
}

补充

突然想起如果我们的配置不一样,可能会看到不一样的提示, 所以补充下我的ts配置, 请大家学习的时候按照这个配置来学习本课程, 每个配置我都加了注释, 如果译文请在下方留言, 知无不言.

用法也很简单, tsconfig.json放在你项目的根目录即可:

// tsconfig.json
{
    "compilerOptions": {
        // 不报告执行不到的代码错误。
        "allowUnreachableCode": true,
        // 必须标注为null类型,才可以赋值为null
        "strictNullChecks": true,
        // 严格模式, 强烈建议开启
        "strict": true,
        // 支持别名导入:
        // import * as React from "react"
        "esModuleInterop": true,
        // 目标js的版本
        "target": "es5",
        // 目标代码的模块结构版本
        "module": "es6",
        // 在表达式和声明上有隐含的 any类型时报错。
        "noImplicitAny": true,
        // 删除注释
        "removeComments": true,
        // 保留 const和 enum声明
        "preserveConstEnums": false,
        // 生成sourceMap    
        "sourceMap": true,
        // 目标文件所在路径
        "outDir": "./lib",
        // 编译过程中需要引入的库文件的列表
        "lib": [
            "dom",
            "es7"
        ],
        // 额外支持解构/forof等功能
        "downlevelIteration": true,
        // 是否生成声明文件
        "declaration": true,
        // 声明文件路径
        "declarationDir": "./lib",
        // 此处设置为node,才能解析import xx from 'xx'
        "moduleResolution": "node"
    },
    // 入口文件
    "include": [
        "src/main.ts"
    ]
}

总结

19年ts一定大火, 请大家放心学ts吧, 初期开发可以先用any体验ts, 慢慢学习1个月左右其实就可以实战了,

微信群

感谢大家的阅读, 如有疑问可以加群🚀, 群里有好多有趣的前端的小伙伴, 让我们共同学习成长吧!

可加我微信, 我拉你进入微信群(由于腾讯对微信群的100人限制, 超过100人后必须由我拉进去)