在TypeScript中使用泛型时分离类型

bqucvtff  于 2023-04-13  发布在  TypeScript
关注(0)|答案(2)|浏览(87)

我有一个enam和一个关联的联合类型

export enum StorageTypeNames {
    User = "user",
    LoadSettings = "loadSettings",
    InitInfo = "isInit",
}

type StorageType = 
    | { name: StorageTypeNames.User, data: 'User' | 'Admin' | 'Amother' }
    | { name: StorageTypeNames.LoadSettings, data?: string[] }
    | { name: StorageTypeNames.InitInfo, data: boolean };

我在课堂上使用了这个联想:

export class StorageHelper {

  static getData<K extends StorageTypeNames>(type: K): **Extract<StorageType, { name: K }>['data'] | null;**

    static getData(type: StorageTypeNames) {
            let data: string | null = null;
            data = localStorage.getItem(type);
            return data ? JSON.parse(data) : null;
        }
}

我想将所选(粗体)部件移动到单独的类型,但通用K有问题
当尝试移动到一个单独的类型时,我得到错误:

type ExtractedType = Extract<StorageType, { name: K }>['data'] | null
//*error Cannot find name 'K'

类型变量“К”x1c 0d1x中的问题
请告诉我如何将所选零件制成单独的类型并在其他地方使用:简单示例:测试操场提前谢谢你!

pexxcrt2

pexxcrt21#

ExtractedType中的K是一个泛型类型参数。因此您需要创建一个泛型类型来将K值传递给ExtractedType
type ExtractedType<K> = Extract<StorageType, { name: K }>['data'] | null
并在getData中作为ExtractedType<K>使用
查看Generics Documentation了解更多信息

92dk7w1h

92dk7w1h2#

您试图生成泛型类型,但忘记了将其设为泛型

type ExtractedType<K> = Extract<StorageType, { name: K }>['data'] | null
//                ^^^ MAKE IT GENERIC

Playground就这些了,祝你今天愉快.

相关问题