ts学习笔记十三:自定义类型

// ts的概念 装包和拆包 
// ref(10) => xxx.value   在模板里面取值 拆包 {{xxx}}  泛型
// wrap  unwrap
let data = { // defineProperty
    name: 'zf',
    age: 12
}
type Proxy<T> = { // 他可以复用
    get(): T,
    set(value: any): void
}
type Proxify<T extends object> = {
    [K in keyof T]: Proxy<T[K]>
}
function proxify<T extends object>(obj: T): Proxify<T> {
    let result = {} as Proxify<T>;
    for (let key in obj) {
        let value = obj[key]
        result[key] = {
            get() {
                return value
            },
            set(newValue) {
                value = newValue
            }
        }
    }
    return result;
}
let proxyDatas = proxify(data);
// 为什么vue2 没有这种方式 ,需要用户学习新的api
console.log(proxyDatas.name.get())
proxyDatas.name.set('xxx');
console.log(proxyDatas.name.get())

function unProxify<T extends object>(obj: Proxify<T>): T {
    let result = {} as T;
    for (let key in obj) {
        let value = obj[key]
        result[key] = value.get();
    }
    return result;
}
let data2 = unProxify(proxyDatas);



// 演变的类型 后续会使用的
let person1 = {
    name: 'zf',
    age: 12,
    address: '回龙观'
}
let person2: {
    address: '回龙观'
}
// 差集  获取两个类型的差集  exclude 在一群类型中忽略掉某个类型  和 omit 对象中忽略
type Diff<T extends object, K extends object> = Omit<T, keyof K>;
type myDiff = Diff<typeof person1, typeof person2>;

// 交集 不是交叉类型  从一个对象中挑取某个类型  Extract
type Inter<T extends object, K extends object> = Pick<K, Extract<keyof T, keyof K>>
type myInter = Inter<typeof person1, typeof person2>;


// 两个对象合并的问题 T & K  = 会有可能导致属性值是never的问题

type Person1 = { // T
    name: string,
    age: number
}
type Person2 = { // K
    age: string,
    address: string
    a: string,
    b: number
}
// 两个类型合并 两个对象的合并 一般都是以后者为准, 如果person1 里面有的 person2里没有在进行添加

// 1.需要拿到多余的肯定是要的
// 2.公告的以后面的为准
// Diff<K, T> 拿到的是 person2 中多的
// 在person1 中忽略person2 的属性
// type Merge<T extends object , K extends object> =  Diff<T, K> &  Diff<K, T> & Inter<T,K>;
type myMerge = Compute<Merge<Person1, Person2>>;
let merge: myMerge = {
    name: 'abc',
    address: 'abc',
    a: '1',
    b: 0,
    age: 'abc'
}
// 我直接 在T里面 忽略掉 K里的  , 只剩T中独有的 + K的
type Compute<T> = { [K in keyof T]: Compute<T[K]> }; // 将类型展开方便提示
type Merge<T extends object, K extends object> = Omit<T, keyof K> & K;

// 主要记住 我们核心的方法 Omit Extract exclude   typeof keyof in  extends

export {}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你关于 TypeScript 中 Symbol 和模块的问题。 首先,Symbol 是 TypeScript 中的一种新的基本数据类型,它可以用来创建唯一的标识符。在 TypeScript 中,Symbol 主要有两种用法: 1. 作为对象属性的键值,用来表示一个对象属性的唯一标识符。 2. 作为一个类的静态属性或方法,用来表示该类的唯一标识符。 下面是一个使用 Symbol 作为对象属性键值的示例: ```typescript const key = Symbol('myKey'); const obj = { [key]: 'value' }; console.log(obj[key]); // 输出'value' ``` 在上面的代码中,我们使用 Symbol('myKey') 创建了一个新的 Symbol,然后将该 Symbol 作为对象 obj 的属性键值,并赋值为'value'。最后,我们通过 obj[key] 的方式来访问该属性,并输出了'value'。 另外,模块是 TypeScript 中的另一个重要概念,它用来组织和管理代码。在 TypeScript 中,模块可以使用 import 和 export 命令来进行导入和导出。下面是一个使用模块的示例: ```typescript // moduleA.ts export const num = 123; // moduleB.ts import { num } from './moduleA'; console.log(num); // 输出123 ``` 在上面的代码中,我们定义了一个名为 num 的常量,并将其导出。然后,在另一个模块中,我们使用 import 命令将 num 导入,并通过 console.log 输出了它的值。 这就是关于 TypeScript 中 Symbol 和模块的简单介绍,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值