Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类型脚本通过类型检查将字段传递给构造函数_Javascript_Typescript - Fatal编程技术网

Javascript 类型脚本通过类型检查将字段传递给构造函数

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! });

我试图通过构造函数的对象传递fields对象:

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,
        });
    }
}