TypeScript3.5.2+Angular7.2.2使用keyof提示“Cannot find name 'keyof'”求助
解决TypeScript中"Cannot find name 'keyof'"的错误
首先,咱们得搞清楚报错的核心原因:keyof是TypeScript的类型操作符,只能在类型上下文里使用,不能直接当作运行时的值来赋值给变量。你原来的代码里let array = keyof Foo;是把它当成了一个值来用,这就触发了错误。
接下来给你两种可行的解决方案,根据你的需求来选:
方案1:类型安全地手动定义属性列表(适合没有实例的场景)
如果不需要依赖Foo的实例,只是想获取Foo类型的所有属性名数组,可以借助一个辅助函数来做类型校验,确保你写的属性名都是Foo的合法键:
// 先确保你定义了Foo类型/接口 interface Foo { id: number; name: string; description: string; } export class Functions { // 辅助函数:约束传入的数组必须是Foo的键组成的数组 private static getValidProperties<T>(props: (keyof T)[]): (keyof T)[] { return props; } static ListObjectProperties(): string[] { // 手动传入Foo的属性名,TypeScript会自动校验是否合法 const fooProperties = this.getValidProperties<Foo>(['id', 'name', 'description']); // 安全转换为string[]类型 return fooProperties as string[]; } }
这种方式的好处是编译时就能检查出非法的属性名,避免拼写错误。
方案2:从Foo实例动态获取属性(适合有实例的场景)
如果你有一个Foo的实例,可以用Object.keys()来动态获取它的属性名,再通过类型断言让TypeScript知道这些属性都是Foo的合法键:
interface Foo { id: number; name: string; description: string; } export class Functions { static ListObjectProperties(fooInstance: Foo): string[] { // Object.keys返回的是string[],用类型断言转为Foo的键类型数组 return Object.keys(fooInstance) as (keyof Foo)[]; } }
额外说明
- 记住
keyof Foo得到的是类型(比如"id" | "name" | "description"),这个类型只存在于编译阶段,编译后的JS代码里是没有的,所以不能直接赋值给变量。 - 如果你用
Object.keys(),TypeScript默认返回string[]是因为它无法确保对象没有额外的自定义属性,所以需要你自己做类型断言来缩小范围。
内容的提问来源于stack exchange,提问作者rdethurens
相关产品推荐
相关产品推荐

