angular - 如何使用 TypeScript 提取接口(interface)的属性(最好没有第 3 方库)

标签 angular typescript

我需要获取接口(interface)的属性以确保它们与实现它的对象相匹配。用于单元测试目的。

因此,如果对接口(interface)进行了更改,如果未使用新成员进行更新,则单元测试应该会中断。

我试过使用 ts-transformer-keys 包,但它会抛出一个关于不是函数的错误。

   interface Test {
      mem1: boolean,
      mem2: string
   }

我想做这样的事情:

   console.log(Object.keys(Test))

期待

   ['mem1', 'mem2'];

最佳答案

接口(interface)在运行时不存在,因此不可能在运行时从接口(interface)中提取任何信息。您可以创建一个具有界面所有键的对象。编译器将强制您指定所有键并检查是否存在额外的键,因此复制永远不会与界面不同步:

interface Test {
    mem1: boolean,
    mem2?: string
}


function interfaceKeys<T>(keys: Record<keyof T, 1>) {
    return Object.keys(keys) as Array<keyof T>
}

console.log(interfaceKeys<Test>({
    mem1: 1,
    mem2: 1
}))

console.log(interfaceKeys<Test>({ // error
    mem1: 1,
}))

console.log(interfaceKeys<Test>({
    mem1: 1,
    mem2: 1,
    mem3: 1,     // error 
}))

play

关于angular - 如何使用 TypeScript 提取接口(interface)的属性(最好没有第 3 方库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57768494/

相关文章:

javascript - 在 Angular 8 中的另一个应用程序中引用服务代码

angular - inject() 必须从注入(inject)上下文中调用

css - 当输入有 .ng-invalid 时更改标签颜色

angular - Nx - 使用运行命令生成器时出现 'Unable to write a reference...' 错误

typescript - Angular2 TypeError : linkParams. forEach 不是函数

angular - 类型 'Observable<Object>' 不可分配给类型 'Observable<boolean>'

javascript - 如何在VUE3中过滤来自代理的记录?

Angular 2 @ViewChild 不工作。无法读取未定义的属性 "title"

javascript - 如何将文本附加到在 React JS 中创建的文本区域?

angular - 无法读取 SafeSubscriber._next 未定义的属性 'push'