首页 > 解决方案 > 与字符串数组声明的键的接口

问题描述

我有一个界面。

interface ICalculateFieldProps {
  fields: string[]
  set: string
  updateFunc: (valuesObj: object, oldValue: any) => any
}

我希望valuesObj密钥仅限于fields: string[]项目。

例如,如果传递['width', 'height']fields. 那么valuesObj一定是

{
  height: any
  width: any
}

标签: typescript

解决方案


...如果传递['width', 'height']fields...

如果你的意思是在 runtime,你不能使用 TypeScript 的类型系统来做到这一点。TypeScript 在编译时完成它的工作。

当然,您可以在运行时通过以下实现中的运行时检查来执行此操作updateFunc

// ...in a class implementing the interface...
updateFunc(valuesObj: object, oldValue: any): any {
    if (Reflect.ownKeys(valuesObj).some(key => !this.fields.includes(key))) {
        throw new Error(`Invalid property ${key} found in valuesObj.`);
    }
    // ...
}

...虽然如果fields是一个Set而不是一个数组可能会更好。


推荐阅读