# 安装使用

  • 安装 npm install -g typescript
  • 编译文件 tsc app.ts

# 基础类型

  • boolean
  • number
  • string
  • array
let arrayType: Array<number> = [1, 2, 3];
or
let arrayType: number[] = [1, 2, 3];
  • tuple
let tupleType: [string, number];
tupleType = ["tupleType", 1];
  • enum
  • void: void 类型与 any 类型相反,它表示没有任何类型
  • null & undefined
let undefinedType: undefined = undefined;
let nullType: null = null;
  • any: 任意类型
  • unknown: 未知的类型
  • never: 无法达到的类型

# 泛型

# 普通版

function identity (value) {
  return value;
}

console.log(identity(1))

# ts版本

function identity (value: Number) : Number {
  return value;
}

console.log(identity(1))
  • 这里 identity 的问题是我们将 Number 类型分配给参数和返回类型,使该函数仅可用于该原始类型。但该函数并不是可扩展或通用的。我们的目标是让 identity 函数可以适用于任何特定的类型,为了实现这个目标,我们可以使用泛型来解决这个问题
function identity <T>(value: T) : T {
  return value;
}

console.log(identity<Number>(1))
  • 当我们调用 identity<Number>(1) ,Number 类型就像参数 1 一样,它将在出现 T 的任何位置填充该类型。 <T> 内部的 T 被称为类型变量,它是我们希望传递给 identity 函数的类型占位符,同时它被分配给 value 参数用来代替它的类型:此时 T 充当的是类型,而不是特定的 Number 类型。

  • 其中 T 代表 Type,在定义泛型时通常用作第一个类型变量名称。但实际上 T 可以用任何有效名称代替。除了 T 之外,以下是常见泛型变量代表的意思:

K(Key):表示对象中的键类型;
V(Value):表示对象中的值类型;
E(Element):表示元素类型。
function identity <T, U>(value: T, message: U) : T {
  console.log(message);
  return value;
}

console.log(identity<Number, string>(68, "Semlinker"));
或者
console.log(identity(68, "Semlinker"));

# 泛型接口

interface Identities<V, M> {
  value: V,
  message: M
}
function identity<T, U> (value: T, message: U): Identities<T, U> {
  let identities: Identities<T, U> = {
    value,
    message
  };
  return identities;
}

console.log(identity(68, "Semlinker"));

# 特殊符号

  • ! 非空断言操作符(name!name值排除 nullundefined)
# 忽略null和undefined
const fn = (myString: string | undefined | null): void => {
  const stringType: string = myString!;
};

# 确定赋值
let name!: string;
init();
console.log(x);

function init() {
  x = 'name';
}
  • ?. 可选链
obj.prop
  • ??空值合并(当左侧为nullundefined时返回右侧的数据)
const name = null ?? 'name';
console.log(name); // "name"

const age = 0 ?? 42;
console.log(age); // 0
  • ?: 可选属性
interface Student {
  name: string;
  age?: number;
}
  • & Type 扩展
  • | 联合类型
  • as<type>断言
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;

let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

# Interface

  • 基本方法
interface Student {
  name: string;
  age: number;
}
  • 可选
interface Student {
  name: string;
  age?: number;
}
  • 只读(赋值后不能修改)
interface Student {
  readonly name: string;
  age: number;
}
  • 任意值
interface Student {
  name: string;
  age: number;
  [key: string]: string;
}

# Type 和 Interface

  • 都可以用来描述对象的结构或函数
interface Student {
  name: string;
  age: number;
}

interface Student {
  (age: number): void;
}

type Student = {
  name: string;
  age: number;
};

type Student = (age: number) => void;

  • 类型别名可以用于一些其他类型
type stringType = string;
type tupleType = [number, string];
type Student = StudentA | StudentB;
  • 都可以被扩展
interface StudentA { name: string }
interface Student extends StudentA { 
  age: number; 
}

type StudentA = { name: string };
type Student = StudentA & { age: number };

  • 接口多次定义会被合并
interface Student { name: string; }
interface Student { age: number; }

const student: Student = { name: 'studentName', age: 20 };

# 装饰器

# tsconfig.json

  • files - 设置要编译的文件的名称;
  • include - 设置需要进行编译的文件,支持路径模式匹配;
  • exclude - 设置无需进行编译的文件,支持路径模式匹配;
  • compilerOptions - 设置与编译流程相关的选项。
{
  "compilerOptions": {

    /* 基本选项 */
    "target": "es5",                       // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6'/'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'
    "module": "commonjs",                  // 指定使用模块: 'commonjs', 'amd', 'system', 'umd' or 'es2015'
    "lib": [],                             // 指定要包含在编译中的库文件
    "allowJs": true,                       // 允许编译 javascript 文件
    "checkJs": true,                       // 报告 javascript 文件中的错误
    "jsx": "preserve",                     // 指定 jsx 代码的生成: 'preserve', 'react-native', or 'react'
    "declaration": true,                   // 生成相应的 '.d.ts' 文件
    "sourceMap": true,                     // 生成相应的 '.map' 文件
    "outFile": "./",                       // 将输出文件合并为一个文件
    "outDir": "./",                        // 指定输出目录
    "rootDir": "./",                       // 用来控制输出目录结构 --outDir.
    "removeComments": true,                // 删除编译后的所有的注释
    "noEmit": true,                        // 不生成输出文件
    "importHelpers": true,                 // 从 tslib 导入辅助工具函数
    "isolatedModules": true,               // 将每个文件做为单独的模块 (与 'ts.transpileModule' 类似).

    /* 严格的类型检查选项 */
    "strict": true,                        // 启用所有严格类型检查选项
    "noImplicitAny": true,                 // 在表达式和声明上有隐含的 any类型时报错
    "strictNullChecks": true,              // 启用严格的 null 检查
    "noImplicitThis": true,                // 当 this 表达式值为 any 类型的时候,生成一个错误
    "alwaysStrict": true,                  // 以严格模式检查每个模块,并在每个文件里加入 'use strict'

    /* 额外的检查 */
    "noUnusedLocals": true,                // 有未使用的变量时,抛出错误
    "noUnusedParameters": true,            // 有未使用的参数时,抛出错误
    "noImplicitReturns": true,             // 并不是所有函数里的代码都有返回值时,抛出错误
    "noFallthroughCasesInSwitch": true,    // 报告 switch 语句的 fallthrough 错误。(即,不允许 switch 的 case 语句贯穿)

    /* 模块解析选项 */
    "moduleResolution": "node",            // 选择模块解析策略: 'node' (Node.js) or 'classic' (TypeScript pre-1.6)
    "baseUrl": "./",                       // 用于解析非相对模块名称的基目录
    "paths": {},                           // 模块名到基于 baseUrl 的路径映射的列表
    "rootDirs": [],                        // 根文件夹列表,其组合内容表示项目运行时的结构内容
    "typeRoots": [],                       // 包含类型声明的文件列表
    "types": [],                           // 需要包含的类型声明文件名列表
    "allowSyntheticDefaultImports": true,  // 允许从没有设置默认导出的模块中默认导入。

    /* Source Map Options */
    "sourceRoot": "./",                    // 指定调试器应该找到 TypeScript 文件而不是源文件的位置
    "mapRoot": "./",                       // 指定调试器应该找到映射文件而不是生成文件的位置
    "inlineSourceMap": true,               // 生成单个 soucemaps 文件,而不是将 sourcemaps 生成不同的文件
    "inlineSources": true,                 // 将代码与 sourcemaps 生成到一个文件中,要求同时设置了 --inlineSourceMap 或 --sourceMap 属性

    /* 其他选项 */
    "experimentalDecorators": true,        // 启用装饰器
    "emitDecoratorMetadata": true          // 为装饰器提供元数据的支持
  }
}

# .d.ts

  • declare var 声明全局变量
  • declare function 声明全局方法
  • declare class 声明全局类
  • declare enum 声明全局枚举类型
  • declare namespace 声明(含有子属性的)全局对象
  • interface 和 type 声明全局类型
  • export 导出变量
  • export namespace 导出(含有子属性的)对象
  • export default ES6 默认导出
  • export = commonjs 导出模块
  • export as namespace UMD 库声明全局变量
  • declare global 扩展全局变量
  • declare module 扩展模块
  • /// 三斜线指令

# 工具

JSON TO TS (opens new window)

TypeScript Playground (opens new window)

TypeScript ESLint (opens new window)