// function 声明
function add(a:number, b: number) {
return a + b
}
// 类型结构声明, 表达式另外声明
let add: (a: number, b: number) => number
type Add: (a: number, b: number) => number
interface IAdd {
(a: number, b: number): number
}
参数
// 可选参数, 默认参数, 剩余参数: 注意顺序
function add(a: number, b = 100, c?: number) {
return c ? a + b + c : a + b
}
function add(x: number, ...rest: number[]) {
return x + rest.reduce((pre, acc) => pre + acc)
}
函数重载
// 同名函数多类型兼容, 根据参数的不同来实现不同功能, 进行匹配
function add(...rest: number[]): number
function add(...rest: string[]): string
function add(...rest: any[]): any {
let first = rest[0]
if (typeof first === 'string') {
return rest.join('')
}
if (typeof first === 'number') {
return rest.reduce((pre, acc) => pre + acc)
}
}
// <类型>值 => <string> value
// 值 as 类型 => value as string
(this.$refs['multiTable'] as any).clearSelection()
(this.$refs['downParams'] as Form).resetFields()
$refs 双重断言
((this.$refs.saveTagInput as Vue)['$refs'].input as HTMLInputElement).focus()
typescript 总结笔记
前言介绍
typescript 的优点 静态弱类型语言, 编译时就会报错, 降低bug,低级错误出现的可能性 自带代码提示,类型注解 对于多人合作的项目比较友好,降低沟通成本
为什么学习 ts 除了上面一些优点之外, ts 可以帮助我们锻炼数据类型思维(数据定义: 数据类型&结构), 提高我们编码的严谨性以及代码的健壮性; 本篇笔记就 ts 的理论基础和实践两个方面进行了一些总结
一些思考 在写 ts 项目时,往往限制的都是我们向外输出的变量类型,而外部向项目中输入的数据结构和类型我们往往没法限制, 比如接口返回的数据, 虽然也可以限制, 但是感觉有点鸡肋 另外: 泛型的使用非常灵活...多写写才能融会贯通
理论基础篇
常用类型
基础篇就快速过一下...
function类型
枚举类型 enum
枚举: 我们可以理解为一组常量的集合, 可以帮助我们解决一些硬编码问题 特别是 if 语句中的判断值
console.log(Direction['Right'], Direction.Up); // Right Up
const up = Direction.Up console.log(up)
class Huhua implements Man { // 类中声明共有属性 name!: string // 赋值断言 age!: number constructor(name: string, age: number) { this.name = name this.age = age } eat() { console.log('eat food') } }
函数类型
class类的类型
ts主要添加
成员的类型注解
和成员修饰符
; ES6中类的数据类型就是函数,类本身就指向构造函数, 其方法都定义在构造函数的 prototype 属性上.我们可以通过 ClassName.prototype.xxx 去访问基类
使用, 我们可以抽离其他类的公共属性和方法 写入抽象类中class Dog extends Animal { // 声明抽象类中的方法, 这里子类可以对父类方法进行重写; 实现所谓的多态 say() { console.log('汪汪汪'); } }
let dog1 = new Dog() dog1.say() // 汪汪汪 dog1.move() // i can move
泛型(相当于给类型传参)
泛型:在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。 在声明的同时指定类型变量的类型值
理论进阶篇
ts类型检查机制
类型推断 根据tsconfig.json的配置规则进行推断, 上下文推断, 类型断言as, 双断言,
is关键字: xx is string, 赋值断言 let x!: string
类型兼容 不同变量相互赋值时的类型检查 函数兼容: 参数个数, 参数类型, 返回值类型 接口兼容: 成员少可以被赋值为成员多的
类型保护 在特殊区块使用确定的类型属性和方法, 比如使用联合类型变量的方法时
联合,交叉,索引类型
交叉 & 合并类型属性
联合 | 指定类型的所有可能性
索引
let iobj = { a: 1, b: 2, c: 'ccc' } // 泛型索引约束 function getObjValue<T, K extends keyof T>(obj: T, keys: K[]): T[K][] { return keys.map(key => obj[key]) } console.log(getObjValue(iobj, ['a', 'c'])); // console.log(getObjValue(iobj, ['a', 'd'])); 保错
declare var 声明全局变量 declare function 声明全局方法 declare class 声明全局类 declare enum 声明全局枚举类型 declare namespace 声明(含有子属性的)全局对象 declare interface 和 type 声明全局类型 export 导出变量 export namespace 导出(含有子属性的)对象 export default ES6 默认导出 export = commonjs 导出模块, import xx = require('xxx') export as namespace UMD 库声明全局变量 declare global 扩展全局变量 declare module 扩展模块
vue 项目中使用的一些问题
本人是在 vue 项目中首先使用的, 发现支持并不是很好...但是还是咬牙写完了一个项目, 后续打算在 react使用一下
相关插件文档
vue-class-component vue-property-decorator vuex-class vuex-module-decorators
类型断言: 用于绕过ts编译器的类型检查; 即手动指定一个值的类型
$refs 双重断言
使用三方库时安装或者自己写声明文件