Typeed变量的Typescript空对象

时间:2017-07-26 23:37:52

标签: javascript typescript

说我有:

type User = {
...
}

我想创建一个新的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

我该怎么做?我不想将变量改为null

8 个答案:

答案 0 :(得分:51)

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

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

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

user01.Email = "foo@bar.com";

这是a working example for you

Here are type assertions working with suggestion.

答案 1 :(得分:12)

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

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

使所有属性可选

function doIt(number) {

  // Don't forget the radix on parseInt
  var waitTime  = parseInt(number, 10);
  if (waitTime > 20) {
    return 'a lot of time'
  } else if (waitTime < 20) {
    return 'we can wait'
  }
}

var result = doIt('53'); // a lot of time
var result = doIt('12'); // we can wait

选项2:如果包含用户的变量可以开始为空

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

虽然,实际上,如果要说明User对象之前可以知道将为其分配什么,那么您可能希望在没有任何赋值的情况下执行type User = { ... } let u1: User = null;

选项3:你可能想要什么

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

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

let u1:User

答案 2 :(得分:2)

您可以在打字稿中按以下方式进行操作

 const _params = {} as any;

 _params.name ='nazeh abel'

由于打字稿的行为不像javascript,因此我们必须将其设为任意类型,否则它将不允许您将属性动态分配给对象

答案 3 :(得分:2)

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

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

因此,将classconstructor一起使用来实际创建具有默认属性的对象。

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代替type

interface UserType {
  Username: string;
  Email: string;
};

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


实际上,您甚至可以跳过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: ""}

答案 4 :(得分:0)

如果您声明一个空的对象常量,然后再分配值,那么您可以认为这些值是可选的(可能存在或可能不存在),因此只需将其键入问号即可:

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

答案 5 :(得分:0)

user: USER

this.user = ({} as USER)

答案 6 :(得分:0)

记录

构造一个对象类型,其属性键为 Keys,属性值为 Type。此实用程序可用于将一种类型的属性映射到另一种类型。

 const user:Record<string,string>={}

答案 7 :(得分:0)

空对象可以写成 Record,所以实际上你的用户类型要么是空对象要么是用户

const 用户:用户 | Record = {};