期望keyof typeof类时不能使用属性名称作为参数

时间:2019-05-28 11:57:56

标签: typescript

我有一个带有静态属性的类:

export class names{
    public static readonly rootNames= {
        a: 'a',
        b: 'b',
        c: 'c',
        d: 'd',
        e: 'e',
    };  
}

我想定义一个函数,该函数的参数只能是这些值之一:

private getSubFolderByName(name: keyof typeof names.rootNames) {}
// name has type 'a' | 'b'... as expected

但是当用例如names.rootNames.a我收到Argument of type 'string' is not assignable to parameter of type '"a" | "b" | "c" | "d" | "e"'的错误,因为这些属性('a','b'等)的类型为string

我尝试过:

private getSubFolderByName(name: typeof names.rootNames[keyof typeof names.rootNames]) {}

但这只是string。我需要防止这些属性的类型扩展为字符串。

1 个答案:

答案 0 :(得分:0)

首先,函数签名必须是第二个版本:

private getSubFolderByName(name: typeof names.rootNames[keyof typeof names.rootNames]) {}

这将创建一个联合类型,其中成员是names.rootNames属性的。第一个版本在names.rootNames中创建了的名称的并集,即使它们碰巧是相同的。

第二,为防止类型扩展,请声明rootNames as const

export class names{
    public static readonly rootNames= {
        a: 'a',
        b: 'b',
        c: 'c',
        d: 'd',
        e: 'e',
    } as const; 
}

这使得例如e的类型为'e',而不是string类型。