首页 > 解决方案 > TypeScript - 在动态定义实例时不能对类型严格

问题描述

我有以下TypeScript可以正确编译的代码。

我的目标是严格限制类型。

在定义user1实例时,我成功地得到了这个效果。我的意思是,我被迫为IUser. 例如,如果我没有为 指定id属性user1,那么当我尝试编译时,TypeScriptlinter 会抛出以下错误:

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

关于如何完成这项工作的任何想法?

谢谢!

标签: javascripttypescript

解决方案


你的问题有点不清楚,但看起来你正在寻找 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
});

推荐阅读