typescript记录

//用于测试的类型
type User = {
  readonly name:string;
  age:number;
  sex:"男" | "女";
  height?:number;
}
// 把所有类型转换为readonly
type MyReadonly<T>= {
  +readonly [key in keyof T]:T[key]
}
const myTest2:MyReadonly<User> = {
  name:"张三",
  age:15,
  sex:"男"
}
myTest2.age = 18; //错误,无法为“age”赋值,因为它是只读属性

// 把所有类型转换为可选
type MyChoosable<T> = {
  [key in keyof T]+?:T[key]
} 
const myTest3:MyChoosable<User> = {}

// 把所有可选变成必选,所有只读变成可改
type MyNegation<T> = {
  -readonly [key in keyof T]-? : T[key]
}
const myTest4:MyNegation<User> = {  //错误,缺少height属性
  name:"张三",
  age:15,
  sex:"男",
}
myTest4.name = "李四"  //正确,不是只读属性

//限制对象的key取值,以及限制类型
type NyRerod<T extends keyof any,U>={
  [key in T] : U
}
type abc = "a" | "b" | "c"
const myTest5:NyRerod<abc,User> = {
  a:{name:"张三",age:18,sex:"女"},
  b:{name:"张三",age:18,sex:"女"},
  c:{name:"张三",age:18,sex:"女"},
}

// 在某个类型中选几个值生成新的类型
type MyPick<T,U extends keyof T> = {
  [key in  U]:T[key]
}
const myTest6:MyPick<User,"name" | "age"> = {
  name:"张三",
  age:18
}

// 将两个类型进行合并,相同键取后面的
type user1 = {
  name:string;
  age:number;
  sex:"男" | "女"
}
type user2 = {
  name:number;
  age:number;
  sex:"A" | "B"
  like:string;
}
type myMerge<T,U> = {
  [key in keyof T | keyof U] : key extends keyof U ? U[key] : key extends keyof T ? T[key] : never
}
type result = myMerge<user1,user2>

// 排除相同的类型
type MyExclude<T,U> = T extends U ? never : T;
type T0 = MyExclude<"a" | "b" | "c", "c">

// 取出共同的类型
type MyExtract<T,U> = T extends U ? T : never;
type T1 = MyExtract<"a" | "b" | "c", "c">

// 指定移除对象的某些健
type Todo = {
  title: string;
  description: string;
  completed: boolean;
  createdAt: number;
}
type myOmit<T,U extends string | number | symbol> = {
  [key in MyExclude<keyof T,U>]:T[key]
}
type TodoPreview = myOmit<Todo, "description">;

// 函数重载定义
function overloadedFunction(x: number): string;
function overloadedFunction(x: string): number;
function overloadedFunction(x: any): any {
    // 实现函数的通用部分
    if (typeof x === 'number') {
        // 处理x为number的情况
        return '这是一个数字: ' + x;
    } else {
        // 处理x为string的情况
        return x.length;
    }
}
 
// 使用函数
let result1 = overloadedFunction(5); // 返回类型是string
let result2 = overloadedFunction('Hello World'); // 返回类型是number
// 映射类型的属性过滤
type User = {
   readonly id:number;
    name:string;
    tel:string;
    address?:string;
}
type A<T,U extends keyof T> = {
    [key in keyof T as key extends U ? never : key] : T[key]
}
type B = A<User,"name" | "tel" >

// 只要类型为string的属性
type C<T, U> = {
    [key in keyof T as T[key] extends U ? key : never]: T[key];
}
type D = C<User, number>

//输入html元素获取它的的类型
type GetElementType<T extends keyof HTMLElementTagNameMap> = HTMLElementTagNameMap[T]
type E = GetElementType<"img">
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
1. TypeScript 是什么?它与 JavaScript 有什么区别? TypeScript 是一种开源的编程语言,它是 JavaScript 的超集,添加了静态类型、类、接口等语言特性,同时保留了 JavaScript 的动态特性和灵活性。 与 JavaScript 相比,TypeScript 最大的不同之处在于其强类型特性。TypeScript 可以帮助开发者在编写代码时尽早发现错误,从而提高代码的可维护性和可读性。 2. TypeScript 中的接口是什么?如何定义接口? TypeScript 中的接口是一种约定,用于规范对象的形状和结构。开发者可以使用接口来定义对象的属性、方法、函数等。 定义接口的语法如下: ```typescript interface InterfaceName { // 属性 propertyName: propertyType; // 方法 methodName(): returnType; } ``` 3. 类是 TypeScript 中的一个重要特性,请简述 TypeScript 类的定义方式和特性。 TypeScript 中的类与其他面向对象编程语言中的类非常相似。类可以包含属性、方法和构造函数,并且可以通过继承和多态来扩展和复用代码。 定义类的语法如下: ```typescript class ClassName { // 属性 propertyName: propertyType; constructor(parameters) { // 构造函数 } // 方法 methodName(): returnType { // 方法体 } } ``` 4. TypeScript 中的装饰器是什么?请举例说明。 TypeScript 中的装饰器是一种用于修改类或类成员的元编程语法。装饰器可以在不修改类的定义的情况下,为类或类成员添加新的功能,例如日志、缓存、验证等。 装饰器的语法如下: ```typescript @decorator class ClassName { @decorator propertyName: propertyType; @decorator methodName(): returnType { // 方法体 } } ``` 其中,@decorator 表示装饰器函数。 例如,以下是一个用于记录方法执行时间的装饰器: ```typescript function logExecutionTime(target, name, descriptor) { const originalMethod = descriptor.value; descriptor.value = function(...args) { console.time(name); const result = originalMethod.apply(this, args); console.timeEnd(name); return result; }; return descriptor; } class MyClass { @logExecutionTime myMethod() { // 方法体 } } ``` 5. TypeScript 中的泛型是什么?请举例说明。 TypeScript 中的泛型是一种用于创建可重用代码的语法。泛型可以让开发者在编写代码时不指定具体的类型,而是使用类型变量来代替。这样,代码就可以适用于多种类型。 例如,以下是一个用于创建数组的泛型函数: ```typescript function createArray<T>(length: number, value: T): T[] { const result: T[] = []; for (let i = 0; i < length; i++) { result.push(value); } return result; } const arr = createArray<string>(3, 'hello'); console.log(arr); // ['hello', 'hello', 'hello'] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值