首页 > 解决方案 > 删除 nodejs typescript 接口中不存在的属性

问题描述

我正在使用带有 typescript 的 node.js,我有一个问题

在转换对象时,可以删除接口中不存在的属性。

interface IFooReal {
                    prop1: string;
                  }

const objTMP = {prop1: 'foo001', prop2: 'foo002', prop3: 'foo003'};

cont barr = objTMP as IFooReal; //or do someting to remove properties not presente in interface

console.log(barr);

当执行console.log(barr);结果是{prop1: 'foo001'}

标签: node.jstypescript

解决方案


使用类型断言likeobjTMP as IFooReal不会改变任何关于的内容objTMP,它只会告诉 TypeScript“请把它当作一个IFooReal”。

TypeScript 的目的只是注释你的代码,让它检查它的类型安全。它不会修改您的代码,也不会添加自己的任何执行(除了有限的例外,如enums)。当 TypeScript 被编译成 JavaScript 时,这个过程主要是删除那些注解。

如果要从对象中删除除一部分属性之外的所有属性,则需要遍历其属性并删除任何与您要保留的属性不匹配的属性。像这样的东西,例如:

interface IFooReal {
    prop1: string;
}

const objTMP = {
    prop1: 'foo001',
    prop2: 'foo002',
    prop3: 'foo003'
};

// You may want to get this by calling Object.keys() on another object?
const propertiesToKeep = ['prop1'];

for (let prop in objTMP) {
    if (propertiesToKeep.includes(prop) === false) {
        delete (objTMP as {[key:string]: any})[prop];
    }
}

console.log(objTMP);

TypeScript 游乐场

我不得不在objTMP as {[key: string]: any})这里使用类型断言,因为否则 TypeScript 会抱怨你试图objTMP使用带有 type 的变量来访问属性string,而 TypeScript 已经隐式键入它,{ prop1: string, prop2: string, prop3: string }所以只有 type 的值'prop1'|'prop2'|'prop3'可以用来访问它的属性.

该类型断言基本上只是告诉 TypeScript“让我尝试使用任何字符串作为键来访问此对象的属性,而不必担心该属性具有什么类型”。


推荐阅读