说我有:

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

我怎么做呢?我不希望变量为空。


当前回答

警告

以下是评论中值得注意的两点。

要么您希望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";

这里有一个工作示例。

其他回答

警告

以下是评论中值得注意的两点。

要么您希望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";

这里有一个工作示例。

这取决于你想做什么。类型是typescript中的文档,所以你想要在创建类型时显示这个东西应该如何使用。

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

让所有属性都是可选的

type User = {
  attr0?: number
  attr1?: string
}

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

type User = {
...
}
let u1: User = null;

不过,实际上,如果这里的重点是在知道将分配给User对象什么之前声明User对象,那么您可能希望执行let u1:User而不进行任何赋值。

选项3:你可能想要的

实际上,打字稿的前提是确保你符合你在类型中概述的思维模式,以避免犯错误。如果你想一个一个地向一个对象添加东西,TypeScript试图让你不要这样做。

更可能的情况是,您希望创建一些局部变量,然后在包含User的变量准备好成为完全的User时将其赋值给它。这样你就永远不会留下一个部分形成的用户。那些东西太恶心了。

let attr1: number = ...
let attr2: string = ...
let user1: User = {
  attr1: attr1,
  attr2: attr2
}

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

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

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

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'

你可以在typescript中这样做

 const _params = {} as any;

 _params.name ='nazeh abel'

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