javascript - TypeScript - 在动态定义实例时不能对类型严格
问题描述
我有以下TypeScript
可以正确编译的代码。
我的目标是严格限制类型。
在定义user1
实例时,我成功地得到了这个效果。我的意思是,我被迫为IUser
. 例如,如果我没有为 指定id
属性user1
,那么当我尝试编译时,TypeScript
linter 会抛出以下错误:
TSError: ⨯ Unable to compile TypeScript:
error TS2322: Type '{ username: string; password: string; email: string; age: number; }' is not assignable to type 'IUser'.
Property 'id' is missing in type '{ username: string; password: string; email: string; age: number; }'.
但另一方面,正如您所看到的用户对应于:Steve Jobs
我没有使用属性:id
但是 linter 没有抛出任何错误。
我正在寻找一种方法来像第二个用户一样动态定义一个用户(而不是像第一个用户那样声明另一个变量)并同时严格控制类型。我尝试使用尖括号没有成功。
interface IUser {
id: number;
username: string;
password: string;
email: string;
age: number;
}
let user1: IUser = {
id: 1,
username: 'Bill Gates',
password: 'windows',
email: 'billgates@microsoft.com',
age: 61
};
var outputObject = function(obj: any) {
console.log(JSON.stringify(obj));
}
outputObject(user1);
outputObject(<IUser> {
username: 'Steve Jobs',
password: 'mac',
email: 'stevejobs@apple.com',
age: 62
});
关于如何完成这项工作的任何想法?
谢谢!
解决方案
你的问题有点不清楚,但看起来你正在寻找 form Partial<T>
。Partial<T>
将类型转换T
为所有属性都是可选的。您可以将Partial<IUser>
其用作参数outputObject
,或者我们可以保留outputObject
并向其添加通用参数,然后我们可以明确指定Partial<IUser>
以检查传入的参数:
var outputObject = function<T>(obj: T) {
console.log(JSON.stringify(obj));
}
outputObject<Partial<IUser>>({
username: 'Steve Jobs',
password: 'mac',
email: 'stevejobs@apple.com',
age: 62
});
outputObject<Partial<IUser>>({
age: '62' // Error incompatible types
});
推荐阅读
- python - 将值分配给 2D numpy 数组作为索引函数的有效方法是什么
- android - 使用意图启动新活动时未显示布局
- json - jekyll 构建错误:JSON 文件中的“控制字符不允许”
- angular - 错误类型错误:无法读取表单控件名称中未定义错误的属性“获取”
- mysql - Mysql - 选择 1 小时前创建的行
- mongodb - 从我的本地机器连接 Docker mongo 集群
- grafana - 如何在 grafana 数据源中传递自定义标头?
- sh - 每次在 Windows 10 上打开 WSL Ubuntu 18.04 时,我都需要运行一个脚本
- c# - MongoDB 超时异常 (C#)
- tomcat - 如何阻止 Tomcat 重定向根 URL 路径并添加斜杠?