[toc]


  • 引用 npm 包,先装对应types/*,再装包
// 1. 没有第三方typescript包时: 在根目录下创建 types 文件夹,创建 模块名+d.ts 文件,文件内容为
declare module 'co-busboy' {
  const content: any
  export = content
}

// 2. 在 tsconfig.json 的 include 中加上 types 文件夹
  • @types/node 可以引入node相关所有包

  • 安装 yarn add typescript -D

  • TS 文件如果使用export导出,文件中的变量会被当做内部变量(闭包),不会认为与其它文件下的变量重名

  • export/import Sometype 表示Sometype只是一个类型, 在编译的时候把这段代码删除掉

数据类型

string number boolean null undefined any

不设置就默认初始赋值的类型

never 返回 never 的函数,表示函数无法执行到最后,比如中途有抛出错误,或出现死循环

结构制定类型

const { xxx: { } }: any  = data

({a, b, c}: {a: boolean, b: string, c:string}) => {}

interface Keys {
    [key: string]: any
}

泛型

function test<T>(arg: T):T{ // 传入什么类型返回什么类型,T可以改为任意字母就是泛指代表
    return arg
}

混合类型

const a:(string|number) =  ''
{ name?:string  }

数组

let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3]; // 使用数组泛型

元组

固定长度 不能用push 不能改变小标长度

const arr:[number, string,boolean] = [1, '2', true]
const arr:Array<number> = [1,2,3]
const arr:number[] = [1,2,3]

函数

默认 返回 void

定义了返回类型 必须加 return

fn(p1?:string, p2?: number)  
const fn = (p: (string | number)[]) => {}

枚举

前端一般用于定义错误码

enum ErrorCode {
    Success= 200
}
ErrorCode.Success

接口 Interface

interface User {
    name: string,
    [props:string]:any,
    readonly age: number
}

interface Func {
    (name:string): string
}

interface A {}
interface B {}

type person = A | B  // 既可以是 A 也可以是 B

类型断言

类似 类型转换

let strLength: number = (<string>someValue).length;
let strLength: number = (someValue as string).length; // 使用JSX时,只有 as语法断言是被允许的

联合类型

https://www.tslang.cn/docs/handbook/advanced-types.html 表示一个值可以是几种类型之一。 用竖线(|)分隔每个类型

定义变量

const a:(string|number)[] = [1,'ko']

// 对象
interface obj {
	[propName: string]: any; // 任意属性
}
const o: obj = {}

Function

function fn(v: number): boolean {}

  • 静态属性,存在于类本身上面而不是类的实例上
const obj:object = {}  // 泛对象

class Obj { // 有良好的类型提示
    name: string
    age: number
    other?:string
    constructor(name:string) {
        this.name = name
    }
}

配置文件

tsconfig.json 是项目的主要 TypeScript 配置文件,它引用了其他两个配置文件, tsconfig.node.json 和 tsconfig.app.json 分别是用于 Node.js(比如启动本地node服务,会执行的文件) 和 应用程序的 TypeScript 配置文件。它们的作用是为不同的构建目标提供不同的 TypeScript 编译选项。

  • npx tsc --init 初始化一个配置文件 如果先安装了 typescript 直接运行 tsc --init

  • tsc --watch 监控ts文件变化 实时生成 js 文件

运行 tsc 时 会默认在根目录下找 tsconfig.json 可以用 --project -p 指定包含配置文件的目录

tsconfig.json 文件修改后不用重启服务

// 常规必要配置
{
    "include": [  // 使用"include"引入的文件可以使用"exclude"属性过滤
        "src/**/*" // 包含文件夹
        "crossProjectModule/**/*", // 如果有不在src的目录需要单独添加 
    ],
    "exclude": [ // 默认情况下会排除node_modules,bower_components,jspm_packages和<outDir>目录
        "node_modules",
    ],
    "compilerOptions": {  // 编译选项 https://www.typescriptlang.org/tsconfig  https://www.tslang.cn/docs/handbook/compiler-options.html
        "target": "ESNext",  // 将ts代码编译为哪个版本的js  1.如果是node执行,用最新的 ESNext 即可 值代表你的 TypeScript 所支持的最高版本 es5 es6
        "module": "es6",  // 用那种模块系统;target 为 ES5或ES3 默认 CommonJs 模块标准;  node 运行 commonjs; 浏览器用  es6 或 es2015
        "removeComments": true,  // 删除注释
        "paths": {                           
            "@cross/*": [ // 自定义别名
                "./crossProjectModule/*"
            ]
        },
    }
}

其它配置项说明

/* 具体配置 参考 https://juejin.cn/post/6844904109976322061#heading-10 */
{
    "include": [  // 使用"include"引入的文件可以使用"exclude"属性过滤
        "src/**/*" // 包含文件夹
    ],
    "exclude": [ // 默认情况下会排除node_modules,bower_components,jspm_packages和<outDir>目录
        "node_modules",
        "**/*.spec.ts"
    ],
    "files": [ // 指定文件  通过 "files"属性明确指定的文件却总是会被包含在内,不管"exclude"如何设置
        "xx.ts"
    ],
    "compilerOptions": {   // 编译选项 https://www.typescriptlang.org/tsconfig  https://www.tslang.cn/docs/handbook/compiler-options.html
        "paths": {                             // 路径映射,相对于 baseUrl
            "jquery": ["node_modules/jquery/dist/jquery.slim.min.js"]
        },
        "rootDir": "./",           // ts源文件目录 Specify what module code is generated. */
        "outDir": "out|./out", // 指定输出目录 会在根目录下创建 /out 文件夹
        "experimentalDecorators": true,     // 使用装饰器,vscode也要打开ts插件的配置
        "incremental": true,                // 增量编译
        "tsBuildInfoFile": "./buildFile",   // 增量编译文件的存储位置
        "diagnostics": true,                // 打印编译信息
        "outFile": "./app.js",     // 将多个相互依赖的文件生成一个文件,可以用在 AMD 模块中
        "lib": [],                 // TS 需要引用的库,即声明文件,es5 默认 "dom", "es5", "scripthost"
        "allowJs": true,           // 允许编译 JS 文件(js、jsx)
        "checkJs": true,           // 允许在JS 文件中报错,通常与 allowJS 一起使用
        "declaration": true,         // 生成声明文件
        "declarationDir": "./d",     // 声明文件的路径
        "emitDeclarationOnly": true, // 只生成声明文件
        "sourceMap": true,           // 生成目标文件的 sourceMap / 生成相应的 .map文件
        "inlineSourceMap": true,     // 生成目标文件的 inline sourceMap
        "declarationMap": true,      // 生成声明文件的 sourceMap
        "typeRoots": [],             // 声明文件目录,默认 node_modules/@types
        "types": [],                 // 声明文件包
        "preserveConstEnums": true,  // 保留 const 和 enum 声明
        "noEmit": true,            // 不输出文件
        "noEmitOnError": true,     // 发生错误时不输出文件
        "noEmitHelpers": true,     // 不生成 helper 函数,需额外安装 ts-helpers
        "importHelpers": true,     // 通过 tslib 引入 helper 函数,文件必须是模块
        "downlevelIteration": true,    // 降级遍历器的实现(es3/5)
        "strict": true,                        // 开启所有严格的类型检查
        "alwaysStrict": false,                 // 在代码中注入 "use strict";
        "noImplicitAny": false,                // 不允许隐式的 any 类型
        "strictNullChecks": false,             // 不允许把 null、undefined 赋值给其他类型变量
        "strictFunctionTypes": false,          // 不允许函数参数双向协变
        "strictPropertyInitialization": false, // 类的实例属性必须初始化
        "strictBindCallApply": false,          // 严格的 bind/call/apply 检查
        "noImplicitThis": false,               // 不允许 this 有隐式的 any 类型
        "noUnusedLocals": true,                // 检查只声明,未使用的局部变量
        "noUnusedParameters": true,            // 检查未使用的函数参数
        "noFallthroughCasesInSwitch": true,    // 防止 switch 语句贯穿
        "noImplicitReturns": true,             // 每个分支都要有返回值
        "esModuleInterop": true,               // 允许 export = 导出,由import from 导入
        "allowUmdGlobalAccess": true,          // 允许在模块中访问 UMD 全局变量
        "moduleResolution": "node",            // 模块解析策略
        "baseUrl": "./",                       // 解析非相对模块的基地址
        "rootDirs": ["src", "util"],           // 将多个目录放在一个虚拟目录下,用于运行时
        "listEmittedFiles": true,        // 打印输出的文件
        "listFiles": true,               // 打印编译的文件(包括引用的声明文件)
    }
}
Last Updated:
Contributors: Warren