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
是行不通的:谢谢,这很有帮助