【发布时间】:2017-06-14 05:51:05
【问题描述】:
假设有一个接口
interface A {
a: number;
}
目前我有一个原始对象
const a = { a: 1, b: '2' };
我希望有一种方法可以让x 成为{ a: 1 },它只包含接口中定义的成员。
这可以通过创建一个空的{}并循环填充所有A的成员来实现,但考虑到接口成员和对象的冗余字段可能多达几十个,这样做并不实用。
我试过了
let x = <A> a; // or let x = a as A;
console.log((x as any).b); // still exist
我还查了lodash,发现keys和pick,但这些都是针对类实例而不是接口的。
【问题讨论】:
-
这不是“铸造”,它甚至在 TS 中都不存在。这是“采摘”。
-
@Mike 不清楚你想要实现什么。 ts 鸭子打字让
a的类型向下转换为A,并且使用打字稿编辑器,您只能访问A的成员,但真实对象始终是a类型。因为 ts 类型擦除意味着对象在运行时属于Object类型,所以您会看到整个a。如果您想要 another 对象,则必须复制其属性(如选择解决方案建议的那样)。相反,如果您想要编译时检查,请使用A并且不要担心真正的对象是什么。 -
@Aris2World 我有一个接口定义,想将一个带有冗余字段的对象转换为它。另外,我不想明确说明要选择的字段。
-
@Mike 可能对对象和类型(接口代表什么)存在误解。假设你也有这个
interface B { b: string; }。您可以将对象a视为A和B类型的对象:let x: A = a您可以访问A或let x: B = a的成员您可以访问B的成员。对象a是Object 类型,它是javascript 中唯一存在的对象。
标签: typescript