Symbol
1.symbol
// 1.使用
let a1:symbol=Symbol(1)
let a2:symbol=Symbol(1)
// symbol 单独创建的内存地址 唯一的
console.log(a1,a2) // Symbol(1) Symbol(1)
console.log(a1===a2) // false
//2. for方法
// for方法使用的时候会去全局的symbol对象之中查找,如果有直接引用,没有的话就创建一个
console.log(Symbol.for("sysy")===Symbol.for("sysy"))
// 3. for in 不能读取到symbol
// 4. Object.keys() 也不能读取到
// 5. Object.getOwnPropertyNames() 也不能读取
// 6. Object.getOwnPropertypeSymbols()只能读取symbol属性
// 7. 解决方式
// es6提供的新方法
Reflect.ownkeys(obj)
迭代器 生成器
- 生成器 generator
function* gen () {
yield "6666" //可以跟同步或者异步
yield Promise.resolve('7777')
}
const man=gen()
console.log(man.next()) // done false
console.log(man.next()) // done false
console.log(man.next()) // done true
- 迭代器 iterator
/* es6新增数据类型 */
// set
let set:Set<number>=new Set([11,222,33,,55,1,2,1,2]) // 天然去重
// map
let map:Map<any,any>=new Map()
// 设置 可以以引用类型当键名
map.set(obj,6666)
// 取值
map.get(obj)
/* 迭代器 */
// 语法糖 for of
// for of 对象不能使用,因为对象没有iterator接口
// 解构的原理也是去调用 iterator
// ????对象的解构赋值如何实现的?
泛型
- 泛型\动态类型
// 1.泛型的定义
function Sum<T>(a:T,b:T):Array<T>{
return [a,b]
}
Sum(1,2)
Sum("1","88")
// 2. 泛型的扩展
// type
type A<T> = string | number | T
let a:A<boolean> = true
// interface
interface Data<T>{
msg:T
}
let data:Data<string>={
msg:"hahah"
}
// 多个泛型 并且支持默认值
function add<T=number ,K>(a:T,b:K):Array<T | K>{
return [a,b]
}
- 泛型的约束
// 通过extends 约束泛型类型
// 01
function add <T extends number>(a:T,b:T){
return a+b
}
// 02
interface Len{
length:number
}
function fn<T extends Len>(val:T){
return val.length
}
// 03 对象
let obj={
name:"666",
age:16
}
/* keyof */
// JavaScript通过 Object.keys()获取对象的所有属性键值,而typescript主要关注的是类型操作,通过 keyof 操作符可以获取对象中的所有键类型组成的联合类型。
function Ob<T extends object,K extends keyof T>(obj:T,key:K){
return obj[key]
}
// 04 高级用法
interface Data{
name:string,
age:number
sex:string
}
// for in for(let key in obj)
type Options<T extends object> = {
[key in typeof T]?:T [key]
}
type B = Options<Data>