说我有:
type User = {
...
}
我想创建一个新用户,但设置它为一个空对象:
const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any
我怎么做呢?我不希望变量为空。
说我有:
type User = {
...
}
我想创建一个新用户,但设置它为一个空对象:
const user: User = {}; // This fails saying property XX is missing
const user: User = {} as any; // This works but I don't want to use any
我怎么做呢?我不希望变量为空。
当前回答
注意,使用const user ={}作为UserType只是提供了智能感知,但在运行时,user是空对象{},内部没有属性。也就是用户。电子邮件将给出undefined而不是""
type UserType = {
Username: string;
Email: string;
}
使用带构造函数的class来创建具有默认属性的对象。
type UserType = {
Username: string;
Email: string;
};
class User implements UserType {
constructor() {
this.Username = "";
this.Email = "";
}
Username: string;
Email: string;
}
const myUser = new User();
console.log(myUser); // output: {Username: "", Email: ""}
console.log("val: "+myUser.Email); // output: ""
你也可以用接口代替类型
interface UserType {
Username: string;
Email: string;
};
...其余代码保持不变。
实际上,你甚至可以跳过构造函数部分,像这样使用它:
class User implements UserType {
Username = ""; // will be added to new obj
Email: string; // will not be added
}
const myUser = new User();
console.log(myUser); // output: {Username: ""}
其他回答
你可以在typescript中这样做
const _params = {} as any;
_params.name ='nazeh abel'
由于typescript的行为不像javascript,所以我们必须使类型为任何,否则它将不允许你动态地分配一个对象的属性
警告
以下是评论中值得注意的两点。
要么您希望user是user |{}或Partial< user >类型,要么您需要重新定义user类型以允许一个空对象。现在,编译器正确地告诉你user不是user。——jcalz
我不认为这是一个正确的答案,因为它创建了一个不一致的类型实例,破坏了TypeScript的整个目的。在本例中,属性Username未定义,而类型注释表示它不能为undefined。- Ian Liu Rodrigues
回答
TypeScript的设计目标之一是“在正确性和生产力之间取得平衡”。如果这样做比较有效,可以使用Type Assertions为类型化变量创建空对象。
type User = {
Username: string;
Email: string;
}
const user01 = {} as User;
const user02 = <User>{};
user01.Email = "foo@bar.com";
这里有一个工作示例。
注意,使用const user ={}作为UserType只是提供了智能感知,但在运行时,user是空对象{},内部没有属性。也就是用户。电子邮件将给出undefined而不是""
type UserType = {
Username: string;
Email: string;
}
使用带构造函数的class来创建具有默认属性的对象。
type UserType = {
Username: string;
Email: string;
};
class User implements UserType {
constructor() {
this.Username = "";
this.Email = "";
}
Username: string;
Email: string;
}
const myUser = new User();
console.log(myUser); // output: {Username: "", Email: ""}
console.log("val: "+myUser.Email); // output: ""
你也可以用接口代替类型
interface UserType {
Username: string;
Email: string;
};
...其余代码保持不变。
实际上,你甚至可以跳过构造函数部分,像这样使用它:
class User implements UserType {
Username = ""; // will be added to new obj
Email: string; // will not be added
}
const myUser = new User();
console.log(myUser); // output: {Username: ""}
空对象可以写为Record<string,不能写为>,所以实际上你的user类型要么是空对象,要么是user
const user : User | Record<string, never> = {};
我想要的是智能感知帮助链中间件。记录<字符串,从来没有>为我工作。
type CtxInitialT = Record<string, never>;
type Ctx1T = CtxInitialT & {
name: string;
};
type Ctx2T = Ctx1T & {
token: string;
};
cont ctx: CtxInitialT = {};
// ctx.name = ''; // intellisense error Type 'string' is not assignable to type 'never'
cont ctx1: Ctx1T = middleware1AugmentCtx(ctx);
// ctx1.name = 'ddd'; // ok
// ctx1.name1 = ''; // intellisense error Type 'string' is not assignable to type 'never'
cont ctx2: Ctx2T = middleware2AugmentCtx(ctx1);
// ctx2.token = 'ttt'; // ok
// ctx2.name1 = ''; // intellisense error Type 'string' is not assignable to type 'never'