说我有:

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 = {
    Username?: string;
    Email?: string;
}

其他回答

如果你声明了一个空对象,然后再赋值,那么你可以认为这些值是可选的(可能存在,也可能不存在),所以只要用问号将它们输入为可选的:

type User = {
    Username?: string;
    Email?: string;
}

你可以在typescript中这样做

 const _params = {} as any;

 _params.name ='nazeh abel'

由于typescript的行为不像javascript,所以我们必须使类型为任何,否则它将不允许你动态地分配一个对象的属性

我想要的是智能感知帮助链中间件。记录<字符串,从来没有>为我工作。

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'

注意,使用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, never>帮助,这是eslint推荐的