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 Typescript拒绝不符合接口的属性_Javascript_Typescript - Fatal编程技术网

Javascript Typescript拒绝不符合接口的属性

Javascript Typescript拒绝不符合接口的属性,javascript,typescript,Javascript,Typescript,我有一个API控制器,它接受这样一个body参数 insertUser(@Body() user: IUser) {} 但是问题是,我可以发布一个对象,该对象包含的属性比IUser定义的属性更多 要确保用户严格遵守类型,或者只保留界面IUser``中定义的类型,最简单、最干净的方法是什么?我的答案与框架无关。您询问如何强制TS不允许传递具有附加字段的类型的值,这意味着我们希望具有该类型的独占行为,您具有相同的属性,或者您不被允许 首先,这样的行为在类型级别是没有好处的,因为如果给定的值有我们需

我有一个API控制器,它接受这样一个body参数

insertUser(@Body() user: IUser) {}
但是问题是,我可以发布一个对象,该对象包含的属性比
IUser
定义的属性更多


要确保
用户
严格遵守类型,或者只保留界面IUser``中定义的类型,最简单、最干净的方法是什么?

我的答案与框架无关。您询问如何强制TS不允许传递具有附加字段的类型的值,这意味着我们希望具有该类型的独占行为,您具有相同的属性,或者您不被允许

首先,这样的行为在类型级别是没有好处的,因为如果给定的值有我们需要的字段,那么其他字段对我们来说就不重要了。另一件事是,即使我们可以对类型进行编译时检查,如果您的数据来自API,那么您需要在运行时级别进行验证

首先,类型级别的独占类型行为实现:

类型IUser={
名称:字符串;
lastname:string;
}
//用于强制使用exlusive类型的实用程序类型
仅键入现有字段={
假装的,假装的,假装的,假装的
}
//具有更多字段的示例类型
类型IMoreUser=IUser&{
年龄:人数;
}
//正确类型的实例
常数u1:IUser={
姓氏:“”,
名称:“”
}
//具有更多字段的类型的实例
常量u2:IMoreUser={
姓氏:“”,
名称:“”,
年龄:12
}
//exlusive函数的下面类型声明
声明函数插入器(用户:U):无效
//用法:

insertUser(u1)//您使用什么API框架?您想在API端还是在API用户端执行强制?Nestjs,但我想要一个不依赖于框架的解决方案。对于API来说,框架本身与如何处理它有很大关系。使用nestjs,您可能会执行拦截器。请记住,JavaScript是一种duck类型的语言,为了匹配属性,您必须匹配它们。我知道大多数JavaScript代码只希望基于您关心的属性应用逻辑,而忽略其他属性。