javascript - TypeScript - 动态定义实例时不能严格限制类型

标签 javascript typescript

我有以下可以正确编译的 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/

相关文章:

Javascript(NodeJs) - 将数组和对象转换为批量插入 mysql(Sequelize)

javascript - 从数组中删除多个对象并返回更新后的数组

javascript - 为什么将我的用户 ID 传递到我的 URL 时未定义?

javascript - 优化嵌套 if 语句

javascript - 如何访问以下数组中的 ID 和 pID?

javascript - 解构对象——如何以更简洁的方式重写

javascript - 如何在 TypeScript 中映射多个类型的数组?

javascript - 将 javascript 嵌套函数迁移到 typescript 出现错误

html - 如何在隐藏侧边栏动画后执行代码?

javascript - 如何在 HTML5 播放器中停止下载视频