【发布时间】:2021-12-09 01:06:02
【问题描述】:
我正在定义一个 typescript 类,其构造函数参数由接口定义,它将属性限制为仅定义的属性。
以下代码 sn-p 可以按预期工作,但是,有没有办法减少代码以使其不那么重复?每个属性都提到了4次,一定有更好的办法。
interface MyInterface {
property1: string;
property2: boolean;
property3: number;
}
class MyClass {
property1: string;
property2: boolean;
property3: number;
constructor(parameters: MyInterface) {
this.property1 = parameters.property1;
this.property2 = parameters.property2;
this.property3 = parameters.property3;
}
}
const example = new MyClass({property1: "Property 1", property2: true, property3: 3, extraProperty: "Shouldn't exist"});
console.log(example);
编辑:我还需要在运行时限制具有其他未知属性的对象的属性。
【问题讨论】:
-
我认为您遇到的问题是您的示例不应该编译。您将收到类型错误,因为
MyInterface没有属性extraProperty。我假设这个对象来自一个外部 API,所以你不能确定它会有什么属性? -
@GeraintAnderson 这就是我希望解决的问题。我需要从 api 中获取一个对象并删除其他未定义的属性
-
啊,这是重要的信息。 TypeScript 已经在编译时尽可能地限制了属性。但是,如果您需要在运行时使用来自 API 的数据检查它们,那么您需要在代码中进行实际检查,例如
if (hasExtraProperties(...)) { throw Error(...) } -
或者实际上您可能只想忽略额外的属性而不是抛出错误。所以也许只是
for (const key in parameters) { if (this.hasOwnProperty(key)) { this[key] = parameters[key] } } -
在运行时需要
["property1", "property2", "property3"]形式的键列表才能执行此操作。像this approach 这样的东西对你有用吗?或者this one?如果是这样,我可以写一个答案供您选择;如果不能,您能否详细说明问题,我可以看看它是否可以解决?
标签: typescript class shorthand