type User = {
readonly name:string;
age:number;
sex:"男" | "女";
height?:number;
}
type MyReadonly<T>= {
+readonly [key in keyof T]:T[key]
}
const myTest2:MyReadonly<User> = {
name:"张三",
age:15,
sex:"男"
}
myTest2.age = 18;
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> = {
name:"张三",
age:15,
sex:"男",
}
myTest4.name = "李四"
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') {
return '这是一个数字: ' + x;
} else {
return x.length;
}
}
let result1 = overloadedFunction(5);
let result2 = overloadedFunction('Hello World');
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" >
type C<T, U> = {
[key in keyof T as T[key] extends U ? key : never]: T[key];
}
type D = C<User, number>
type GetElementType<T extends keyof HTMLElementTagNameMap> = HTMLElementTagNameMap[T]
type E = GetElementType<"img">