Javascript 类型脚本通过类型检查将字段传递给构造函数
我试图通过构造函数的对象传递fields对象:Javascript 类型脚本通过类型检查将字段传递给构造函数,javascript,typescript,Javascript,Typescript,我试图通过构造函数的对象传递fields对象: new Alloy({ name: "foo" }) 问题在于未检查类型: export class Alloy { name!: string constructor(data: Partial<Alloy>) { Object.assign<Alloy, Alloy>(this, { name: data.name! });
new Alloy({ name: "foo" })
问题在于未检查类型:
export class Alloy {
name!: string
constructor(data: Partial<Alloy>) {
Object.assign<Alloy, Alloy>(this, {
name: data.name!
});
}
}
问题在于你的类的定义。通过添加
代码>s,您告诉TS您知道它不会是未定义/空的,而不是它是必需的
您永远不会遇到这样的运行时错误,因为所有类型检查都发生在编译时,而不是运行时
如果您这样声明类,那么您将允许TS向您显示问题:
export class Alloy {
name: string
constructor(data: Partial<Alloy>) {
Object.assign<Alloy, Alloy>(this, {
name: data.name,
});
}
}
出口级合金{
名称:string
建造商(数据:部分){
对象。分配(此{
name:data.name,
});
}
}
现在,您会遇到错误,告诉您名称不一定是未定义的,data.name也可能是未定义的,因此无法分配给所需的属性。您会遇到什么错误?因为我传递的是未定义的名称,所以我希望会有错误。然后第二个测试失败,因为它没有抛出任何东西(接收的函数没有抛出任何东西
)您的型号Alloy
中不需要名称。您需要设置名称字符串的类型,但不要将其设置为可选:)如何设置<代码>名称!:字符串
!标记器是否根据需要设置名称?没有?@Xero name!跳过此属性的空/未定义检查-这是强制绕过您想要的行为谢谢您的答案,但这不起作用,我得到属性“name”没有初始值设定项,并且没有在构造函数中明确指定。ts(2564)
@Xero-是-但我认为您的问题是“为什么这没有失败”?现在失败了,因为它不正确。你打算怎么做?如果您希望定义所有属性,则不应使用Partial初始化它。如果你能提供更多关于预期行为的信息,我可以尝试提出一个解决方案。你可以选择:a.检查名称是否设置,如果没有设置,则抛出运行时错误。B.通过将Partial替换为Partial&{name:string},要求在构造函数参数中设置该名称。
export class Alloy {
name: string
constructor(data: Partial<Alloy>) {
Object.assign<Alloy, Alloy>(this, {
name: data.name,
});
}
}