类型断言
- 给一些返回值是多种类型的变量或者函数,在确定返回值的情况下进行类型断言 ```typescript let obj: any = ‘str’
//方式一
let res: string = (
//方式二 let res: string = (obj as string).substr(0, 1)
<a name="dUa7f"></a>### symbol```typescript// 声明一个symbol 值const s = Symbol()// 是独一无二的const s1 = Symbol()const s2 = Symbol()console.log(s1 === s2) // falseconst s1 = Symbol('name')const s2 = Symbol('name')console.log(s1 === s2) // false// 作为对象keyconst s3 = Symbol('name')const obj = {[s3]: 'zxc'}obj[s3] = 'qwe' //只能通过[] 形式修改值,不能通过 obj.s3// 作为对象key 时,去获取for(const key in obj) //无法获取 symbol 作为key 的值Object.keys(obj) //无法获取 symbol 作为key 的值Object.getOwnPropertyNames(obj) //无法获取 symbol 作为key 的值JSON.stringify(obj) //无法获取 symbol 作为key 的值Object.getOwnPropertySymbols(obj) // 只获取 symbol 作为key 的值Reflect.ownKeys(obj) // 可以获取到对象的所有key,包括 Symbol
Symbol.for
- 在全局创建一个 Symbol 值 ```typescript const s1 = Symbol.for(‘zxc’) const s2 = Symbol.for(‘zxc’)
s1 === s2 // true
<a name="gnMlJ"></a>#### Symbol.keyFor- 返回 Symbol.for() 创建的唯一标识```typescriptconst s1 = Symbol.for('zxc')Symbol.keyFor(s1) // 返回的就是字符串 zxc
泛型
理解
- 给某个值或者方法加上 类型变量,比如T,来指定返回的类型
```typescript
const getArray =
(value: T, times: number = 5): T[] => { return new Array(times).fill(value) }
//当 value 是 string 时
getArray
//当 value 是 number 时
getArray
- 多个泛型变量的使用```typescriptconst getArray = <T, U>(arg1: T, arg2: U, times: number): [T, U][] => {//返回 [T, U][] T U 构成的元组return new Array(times).fill([arg1, arg2])}//使用中针对不同元素getArray<number, string>(10, 'zxc', 3).forEach(item => {item[0].toFixed()item[1].length})
泛型定义函数类型
let getArray: <T>(arg: T, times: number) => T[]//定义函数体getArray = (arg: string, times: number) = > {return new Array(times).fill(arg)}//使用函数getArray('zxc', 3).map(item => item.length)
类型别名中使用泛型
type GetArray: <T>(arg: T, times: number) => T[]//定义函数体let getArray: GetArray = (arg: string, times: number) = > {return new Array(times).fill(arg)}//使用函数getArray('zxc', 3).map(item => item.length)
接口中使用泛型
interface GetArray {<T>(arg: T, times: number): T[]}//或者这样interface GetArray<T> {(arg: T, times: number): T[]}
泛型约束
- 通过 extends 关键字实现泛型约束
- 约束 类型变量 T 的取值
interface ValueWithLength {length: number}const getArray = <T extends ValueWithLength>(arg: T, times: number): T[] => {return new Array(times).fill(arg)}//正确getArray([1, 2], 3)getArray('zxc', 3)getArray({length: 3}, 3)//错误, 因为不具备length属性getArray(10, 3)
在泛型约束中使用类型参数
- 使用 keyof 关键字,获取类型变量上所有属性成员,并以数组的形式返回
```typescript
const getProps =
(obj: T, propName: K) => { return obj[propName] }
const data = { name: ‘zxc’, age: 18 }
getProps(data, ‘name’) // 正确,因为有name属性 getProps(data, ‘address’) // 错误,因为没有address属性 ```
