我有以下可以正确编译的 TypeScript
代码。
我的目标是严格遵守类型。
当定义user1
实例时,我成功地得到了这个效果。我的意思是,我被迫定义 IUser
的所有成员。例如,如果我没有为 user1
指定 id
属性,那么当我尝试编译时,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
});
关于如何完成这项工作有什么想法吗?
谢谢!
最佳答案
您的问题有点不清楚,但您似乎正在寻找表格 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
});
关于javascript - TypeScript - 动态定义实例时不能严格限制类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51276332/