我有一个带有静态属性的类:
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
。我需要防止这些属性的类型扩展为字符串。
答案 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
类型。