Skip to content

通过类型推断写出 T[Key]

ts
function getPropValue<T extends object, Key extends keyof T>(obj: T, key: Key): T[Key] {
    return obj[key];
}

这里的 Key in keyof T 取出来是Type 'Key' is not assignable to type 'string | number | bigint | boolean | null | undefined'.需要要用交叉类型做合并;

ts
type MapType<T> = {
    [
        Key in keyof T 
            as `${Key & string}${Key & string}${Key & string}`
    ]: [T[Key], T[Key], T[Key], T[Key]]
}

type res = MapType<{a: 1, b: 2}>;
递归复用做循环

举例:常用的递归推断

ts
type ttt = Promise<Promise<Promise<Record<string, any>>>>

// 递归复用做循环。
// 如果T是一个Promise,它会递归地对提取出的U应用DeepPromiseValueType。
// 这里的infer是做类型推断,extends是使用条件语句。
type DeepPromiseValue<T> = T extends Promise<infer U> ? DeepPromiseValue<U> : T;

type res = DeepPromiseValue<ttt>;

给所有类型加上readonly

ts
type Readonly<T> = {
    readonly [P in keyof T]: T[P]
}

type res = Readonly<{a: 1, b: 2}>;

递归给所有类型加上readonly

ts
type DeepReadonly<T> = {
    readonly [P in keyof T] : T[P] extends object ? DeepReadonly<T[P]> : T[P];
}

const v = {
    k1: 1,
    k2: {
        k21: 2,
        k22: 3
    }
} as const; // 使用 as const 将对象定义为常量类型,确保所有属性都是只读的
本站访客数 人次 本站总访问量