假设我有以下代码:
interface A {
a: number;
}
interface B extends A {
b: number;
}
const b: B = {a: 1, b: 5};
const a: A = b as A;
现在变量a
的类型为A
,但它仍然包含b
。有时候这是不可取的-我想确保,如果我有一个类型为A
的变量,它的字段类型为A
。我想知道,TypeScript是否有某种“硬转换”,在类型之间转换时会删除任何不需要的字段。
假设我有以下代码:
interface A {
a: number;
}
interface B extends A {
b: number;
}
const b: B = {a: 1, b: 5};
const a: A = b as A;
现在变量a
的类型为A
,但它仍然包含b
。有时候这是不可取的-我想确保,如果我有一个类型为A
的变量,它的字段类型为A
。我想知道,TypeScript是否有某种“硬转换”,在类型之间转换时会删除任何不需要的字段。
3条答案
按热度按时间4si2a6ki1#
在TypeScript中没有强制转换,因为这不是TypeScript的工作方式。TS是JS之上的类型层。当你在TS中分配一个类型时,你没有设置类型,你 * 注解 * 给定的表达式是某种类型。当TS代码被编译为JS时,所有类型信息都被剥离。
或者换句话说:类型系统是JS,使用TS你只需要声明一个变量是某个类型。2通常你在设计的时候分配了错误的类型,在调试的时候你会惊讶的发现这个变量的类型和预期的完全不同。
如果你想确保一个属性从一个对象中被移除,你需要使用JS的方式(如果需要的话,用TS注解结果)。检查this Q&A来了解如何从一个对象中移除属性。
xesrikrc2#
Typescript不会为你做这件事,因为这不是他的工作。
使用省略号
或者只删除“a”,但避免删除,这是命令式的,TS不会理解它,处理vm删除的属性也会更慢
或者使用Lodash,您可以挑选您想要的属性
或省略仍在使用lodash的属性
示例
ni65a41a3#
我本来不打算回答,但我选择回答的原因是,我觉得删除原始对象中的数据可能并不总是一个好主意。
相反,我认为最好创建一个新变量,并将数据(不包括不需要的属性)复制到新变量。
在我的情况下,我想把我的注册表转换成登录信息(电子邮件和密码)和其他信息(关于如何找到网站)。
下面的解决方案非常易于使用(在各种情况下),并且易于扩展。