说我有:
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
。
答案 0 :(得分:51)
我们可以使用Type Assertions为类型变量创建空对象。
type User = {
Username: string;
Email: string;
}
const user01 = {} as User;
const user02 = <User>{};
user01.Email = "foo@bar.com";
答案 1 :(得分:12)
真的取决于你想要做什么。类型是typescript中的文档,因此您希望显示在创建类型时如何使用此事物的意图。
使所有属性可选
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
type User = {
attr0?: number
attr1?: string
}
虽然,实际上,如果要说明User对象之前可以知道将为其分配什么,那么您可能希望在没有任何赋值的情况下执行type User = {
...
}
let u1: User = null;
。
实际上,打字稿的前提是确保你符合你在类型中勾勒出的心理模型,以避免犯错误。如果您想逐个添加对象,这是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;
}
因此,将class
与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: ""
您也可以使用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