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">
const names = ["Daniel Craciun", "John Doe", "Harry Pigeon"] as const;
type Names = typeof names[number];
type SurName<T extends string> = T extends `${infer a} ${infer b}` ? b : never;
type myName = SurName<Names>;
const findName = (surname: myName) => {
return names.find((name) => {
return name.includes(surname);
});
}
console.log(findName("Doe"), "name");
console.log(findName("aaa"), "name");
type Watcher<T> = {
on: <K extends keyof T & string>(event: `${K}Change`, callback: (oldValue:T[K],newValue:T[K]) =>void) => void;
}
declare function watch<T>(obj:T):Watcher<T>;
const personWatcher = watch({
firstName: 'John',
lastName: "Doe",
age: 30,
sex:"男"
});
personWatcher.on("firstNameChange",(oldValue,newValue)=>{
});
type JStypeMap = {
"string": string;
"number": number;
"boolean": boolean;
"symbol": symbol;
"function": Function;
"undefined": undefined;
"object": object;
"bigint": bigint;
"null": null;
}
type typeKey = keyof JStypeMap;
type typeValue<T extends typeKey[]> = {
[key in keyof T] : JStypeMap[T[key]]
};
declare function addImpl<T extends typeKey[]>(...arg:[
...T,
(...arg:typeValue<T>) => any
]):any;
addImpl("string","string","symbol",(a,b,c) =>{
console.log(a,b,c);
});