Javascript TypeScript-在动态定义实例时不能严格使用类型

Javascript TypeScript-在动态定义实例时不能严格使用类型,javascript,typescript,Javascript,Typescript,我有以下TypeScript代码,可以正确编译 我的目标是在类型方面严格要求 当定义user1实例时,我成功地获得了这种效果。我的意思是,我必须为IUser定义所有成员。例如,如果我没有为user1指定id属性,那么当我尝试编译时,TypeScriptlinter抛出以下错误: TSError: ⨯ Unable to compile TypeScript: error TS2322: Type '{ username: string; password: string; email: stri

我有以下
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
});
接口IUser{
id:编号;
用户名:字符串;
密码:字符串;
电子邮件:字符串;
年龄:人数;
}
让user1:IUser={
id:1,
用户名:“比尔·盖茨”,
密码:“windows”,
电邮:'billgates@microsoft.com',
年龄:61
};
var outputObject=函数(对象:任意){
log(JSON.stringify(obj));
}
输出对象(user1);
输出对象({
用户名:“史蒂夫·乔布斯”,
密码:“mac”,
电邮:'stevejobs@apple.com',
年龄:62
});
你知道怎么做吗


谢谢

你的问题有点不清楚,但看起来你是从
部分
看的
Partial
将类型
T
转换为具有所有可选属性。您可以使用
Partial
作为
outputObject
的参数,或者我们可以保留
outputObject
并向其添加一个通用参数,然后可以显式指定为
Partial
,以检查传入的参数:

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
});
var outputObject=函数(obj:T){
log(JSON.stringify(obj));
}
输出对象({
用户名:“史蒂夫·乔布斯”,
密码:“mac”,
电邮:'stevejobs@apple.com',
年龄:62
});
输出对象({
年龄:'62'//错误不兼容类型
});

您断言匿名对象是一个
IUser
,这就是为什么TypeScript对它很满意。如果
outputUser
需要一个
IUser
,请更改其签名:
outputUser=function(obj:IUser)
对不起,我搞错了,函数的名称应该是:
outputObject
,它应该接受对象的任何kiind。当提供第二个用户时,我希望严格控制类型。我知道,如果我将该函数的参数声明为
IUser
,它将起作用,但我不想这样做,因为该参数可以是任何类型。要影响您正在查找的错误,您需要为类型为
IUser
的变量或参数赋值。断言它是一个
IUser
是行不通的:谢谢,这很有帮助