TS使用记录

499 阅读4分钟

线上编译环境 www.typescriptlang.org/play

注意事项

  • 使用ts之后,如果文件的内容是react的代码形式,文件后缀名必须为tsx。

基础类型

  • Boolean类型
const isShow: boolean = false;
  • Number类型
const age: number = 24;
  • String类型
const name: string = 'dyx';
  • Symbol 类型
const sym = Symbol();
const obj = {
  [sym]: "semlinker",
};

console.log(obj[sym]); // semlinker 
  • Array 类型
const arr: number[] = [1, 2, 3];
const arr: Array<number> = [1, 2, 3]; // Array<number>泛型语法
const arr: ReadonlyArray<number> = [1, 2, 3]; // arr定义之后不可进行修改
  • Enum 类型(枚举类型)
export enum StatusEnum {
  CREAT = 'CREAT',
  DONE = 'DONE',
  PAUSE = 'PAUSE',
  DELETE = 'DELETE',
}
const status: StatusEnum = StatusEnum.CREAT;
  • Any 类型(可以为任何类型,应减少使用)
let anyState: any = 'dyx';
anyState = 24;
anyState = false;

// 可以将any类型的变量赋值给任何一种类型的变量
const age: number = anyState;
const isMan: boolean = anyState;

let info: any;

info.name; // ok
info.friends.good; // ok
  • Unknown 类型

可以给一个定义类型为unknown类型的变量赋任何类型的值,但是只能将这个变量赋值给any、unknown类型的变量。

let unknownState: unknown = 'dyx';
unknownState = 24;
unknownState = false;

// 只能将这个变量赋值给any、unknown类型的变量
const sex: any = anyState; // ok
const level: unknown = anyState; // ok
const age: number = anyState; // error
const isMan: boolean = anyState; // error

let info: unknown;
info.name; // error
info.friends.good; // error
  • Tuple 类型(元组)

使用方式与数组类似,可以存储不同类型的数据。使用时每一项类型必须匹配,且初始化时必须提供每个属性的值

let tupleType: [string, boolean];
tupleType = ["name", true];

console.log(tupleType[0]); // 'name'
console.log(tupleType[1]); // true
  • Void 类型

表示没有任何类型,当一个函数没有返回值时,将其返回值的类型设置为 void; 如果使用此类型声明变量,值只能为undefined或者null;

// 声明函数返回值为void
function getUser(): void {
  console.log("name");
}

interface Props {
  onChange?: (value: string) => void;
}

let voidState: void = undefined;
  • null 和 undefined 类型

可以把 null 和 undefined 赋值给 任意 类型的变量;如果指定了--strictNullChecks 标记,null 和 undefined 只能赋值给 void 和它们各自的类型。

let un: undefined = undefined;
let nu: null = null;
  • Never 类型

永不存在的值的类型, 使用 never 类型检验 避免出现新增类型之后没有对应的代码兼容实现,目的是保证代码的绝对健壮

  • 正常如下使用时编译没有问题,如果修改了Age的类型为type Age = string | number | boolean;,但是没有修改controlAgeTypeWithNever方法逻辑,就会有编译错误。
type Age = string | number;

const controlAgeTypeWithNever = (age: Age) => {
  if (typeof age === "string") {
  } else if (typeof age === "number") {
  } else {
    const isCheck: never = age;
  }
}

声明类型

  • 普通形式
const name: string = 'dyx';
  • as语法
const name: string = 'dyx';
let nameLength: number = (name as string).length;
  • 尖括号语法
const name: string = 'dyx';
let nameLength: number = (<string>name).length;

非空断言

// 从值域中排除 null 和 undefined
const func = (name: string | undefined | null) => {
  const copyName: string = name; // error
  const stringName: string = name!; // ok
}

声明一个变量是选择性传递的

value?: string  // 可以为undefined或者字符串

声明一个变量可以是多个类型

value: string | number // 可以为string或number

将多个类型进行合并

  • 非同名合并
type CoordinateX = { x: number; };
type Coordinate = CoordinateX & { y: number; };

const coordinatePoint: Coordinate = {
  x: 1,
  y: 1
}
  • 同名的基础类型合并之后变为never类型的数据,同名的非基础类型数据可以成功合并。
interface Bool { isMan: boolean; }
interface Str { name: string; }
interface Num { age: number; }

interface InfoA { info: Bool; }
interface InfoB { info: Str; }
interface InfoC { info: Num; }

type AllInfo = InfoA & InfoB & InfoC;

const userInfo: AllInfo = {
  info: {
    isMan: true,
    name: 'dyx',
    age: 24
  }
};

函数

ts有函数重载而js没有

定义参数类型和返回类型

function getUser(name: string, age: number): string {
  return name + age;
}

可选参数以及默认参数

可选参数放在普通参数后面

// 可选参数
function getUser(name: string, age: number, sex?: string): string {
  return name + age;
}

// 默认参数
function getUser(name: string = 'dyx', age: number, sex?: string): string {
  return name + age;
}

interface

普通类型

interface Person {
  name: string;
  age: number;
}

const userInfo: Person = {
  name: "dyx",
  age: 24,
};

可选以及只读

// 表示name属性不可修改,且age属性是可选的
interface Person {
  readonly name: string;
  age?: number;
}

任意属性

interface Person {
  name: string;
  age?: number;
  [propName: string]: any; // 可以添加任意属性值
}

泛型Partial

Partial<T>的作用就是将某个类型里的属性全部变为可选项 ?

ts代码书写常用示例

react

  • hooks定义状态的类型
const [name, setName] = useState<string>('dyx');
  • class形式组件声明props和state
interface Props {
  name: string;
}
interface State {
  age: number;
}

class User extends React.Component<Props, State> {

}
  • class形式组件上定义了一个属性,在最上方声明类型即可
class User extends React.Component<Props, State> {
  chartIns: any; // 定义的属性
}
  • location 和 match 的类型定义
import { Location, Match } from "react-router";
  • Route的组件的props类型
// 直接使用RouteComponentProps 作为组件的props的类型
import { RouteComponentProps } from "react-router-dom";
  • 事件对象
import type { ChangeEvent, MouseEvent } from 'react';
// input取值等操作
e: ChangeEvent<HTMLInputElement>

// 阻止冒泡等操作
event: MouseEvent

// img标签取值
e: ChangeEvent<HTMLImageElement>

common

  • moment连续取值报错
import moment from "moment-timezone";
  • 当定义一个变量可能时对象或者undfined时 比如 find方法的返回值,下方取值时会提示错误,取值加!号即可
const matchInfo: OrderButton | undefined // 定义
matchInfo!.name  // 取值
  • 定时器的定义
let timer = 0;
// 必须使用window.setInterval,不加window会有校验的错误
timer = window.setInterval(() => refreshDeliverInfo(), 10000);
  • dom操作的类型定义
let btn = buttons[0] as HTMLElement