使用typescript时,声明的接口可能如下所示:

interface MyInterface {
  test: string;
}

具有额外属性的实现可以是这样的:

class MyTest implements MyInterface {
  test: string;
  newTest: string;
}

Example(此处变量"reduced"仍包含属性"newTest"):

var test: MyTest = {test: "hello", newTest: "world"}

var reduced: MyInterface = test; // something clever is needed

Question

一般来说,如何使"reduced"变量只包含在"MyInterface"接口中声明的属性.

Why

当try 将"简化"变量与Angular 变量一起使用时,会出现问题.toJson在发送给rest服务之前——toJson方法会转换newTest变量,即使在编译期间实例上无法访问该变量,这会使rest服务不接受json,因为它具有不应该存在的属性.

推荐答案

这是不可能的.原因是interface是一个Typescript构造,而transpiled JS code是空的

//this code transpiles to empty!
interface MyInterface {
  test: string;
}

因此,在运行时没有什么可"使用"的东西——没有可查询的属性.

@jamesmoey给出的答案解释了一种实现预期结果的变通方法.

class MyInterface {
  test: string = undefined;
}

然后,您可以使用lodash从"接口"中 Select 要注入对象的属性:

import _ from 'lodash';  //npm i lodash

const before = { test: "hello", newTest: "world"};
let reduced = new MyInterface();
_.assign(reduced , _.pick(before, _.keys(reduced)));
console.log('reduced', reduced)//contains only 'test' property

JSFiddle

这是一个实用的解决方案,对我很有帮助,而且没有陷入关于它是否真的是一个接口和/或命名约定(例如IMyInterfaceMyInterface)的语义问题,并且允许您模拟和单元测试

Typescript相关问答推荐

创建一个将任意命名类型映射到其他类型的TypScript通用类型

在角形加载组件之前无法获取最新令牌

当类型断言函数返回假时,TypScript正在推断从不类型

将props传递给子组件并有条件地呈现它''

为什么TypeScript假设文档对象始终可用?

有什么方法可以类型安全地包装import()函数吗?

17个Angular 的延迟观察.如何在模板中转义@符号?

为什么TS2339;TS2339;TS2339:类型A上不存在属性a?

在单独的组件中定义React Router路由

Cypress-验证别名的存在或将别名中的文本与';if';语句中的字符串进行比较

在REACT查询中获取未定义的isLoading态

如何使用警告实现`RecursiveReadonly<;T>;`,如果`T`是原语,则返回`T`而不是`RecursiveReadonly<;T>;`

如何从抽象类的静态方法创建子类的实例?

仅当类型为联合类型时映射属性类型

如何调整项目数组,但允许权重影响顺序

Vite+Chrome扩展 list v3-;不能在模块外使用import语句;对于inpage脚本

组件使用forwardRef类型脚本时传递props

类型分布在第一个泛型上,但不分布在第二个泛型上

React中的效果挂钩在依赖项更新后不会重新执行

Angular另一个组件的nativeelement未定义