Typeed变量的Typescript空对象

Kou*_*sha 43 javascript typescript

说我有:

type User = {
...
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的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
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?我不想变量null.

Sha*_*tin 79

我们可以使用Type Assertions为类型变量创建空对象.

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

const user01 = {} as User;
const user02 = <User>{};

user01.Email = "foo@bar.com";
Run Code Online (Sandbox Code Playgroud)

这是一个适合你的工作示例.

以下是使用建议的类型断言.

  • 谢谢!这解决了!这应该标记为正确的答案...... (7认同)
  • 我认为这不应该被视为一个正确的答案,因为它创建了一个不一致的类型实例,破坏了 TypeScript 的整个目的。在这个例子中,属性`Username` 没有定义,而类型注释说它不能被定义。 (4认同)
  • @IanLiuRodrigues TypeScript 的目标之一是平衡正确性和生产力,所以说这*破坏了 TypeScript 的整体目的*有点极端。https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals (3认同)
  • 好点@IanLiuRodrigues。我在答案中添加了一些警告。 (2认同)

noo*_*ob7 54

空对象可以写为Record<string,never>,因此实际上您的 user 类型要么是空对象,要么是 User

const user : User | Record<string, never> = {};
Run Code Online (Sandbox Code Playgroud)


pix*_*pax 17

真的取决于你想要做什么.类型是typescript中的文档,因此您希望显示在创建类型时如何使用此事物的意图.

选项1:如果用户在其生命周期内可能拥有某些但不是所有属性

使所有属性可选

type User = {
  attr0?: number
  attr1?: string
}
Run Code Online (Sandbox Code Playgroud)

选项2:如果包含Users的变量可能开始为null

type User = {
...
}
let u1: User = null;
Run Code Online (Sandbox Code Playgroud)

虽然,实际上,如果要说明User对象之前可以知道将分配给它的内容,那么您可能希望不做let u1:User任何赋值.

选项3:你可能想要什么

真的,打字稿的前提是确保你符合你在类型中勾勒出的心理模型,以避免犯错.如果您想逐个添加对象,这是TypeScript试图让您不要做的习惯.

更有可能的是,您想要创建一些局部变量,然后在准备好成为完全用户时分配给包含用户的变量.这样你永远不会留下部分形成的用户.那些事情很糟糕.

let attr1: number = ...
let attr2: string = ...
let user1: User = {
  attr1: attr1,
  attr2: attr2
}
Run Code Online (Sandbox Code Playgroud)

  • 不确定这是否是他想要的,但我们可能正在谈论一个名为 UserAttributes 的单独参数或处理传入参数的东西。它可能不是可接受的用户对象,因此可以单独定义它。 (2认同)

小智 12

就我而言Record<string, never>有帮助,这是 eslint 推荐的 埃斯林特建议


Wen*_* Du 9

不要用作{}类型。{}实际上意味着“任何非空值”。

  • 如果您想要一个表示“空对象”的类型,您可能需要Record<string, never>改为。
  • 如果您想要一种含义为“任何对象”的类型,您可能需要object改为。
  • 如果您想要一个表示“任何值”的类型,您可能需要unknown改为。


Jer*_*yal 6

请注意, usingconst user = {} as UserType仅提供智能感知,但在运行时user是空对象{},内部没有任何属性。这意味着user.Email将给予undefined而不是""

type UserType = {
    Username: string;
    Email: string;
}
Run Code Online (Sandbox Code Playgroud)

因此,使用classwith constructor 实际创建具有默认属性的对象。

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: ""
Run Code Online (Sandbox Code Playgroud)

您也可以使用interface代替type

interface UserType {
  Username: string;
  Email: string;
};
Run Code Online (Sandbox Code Playgroud)

...其余代码保持不变。


实际上,您甚至可以跳过该 constructor 部分并像这样使用它:

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: ""}
Run Code Online (Sandbox Code Playgroud)