说我有:
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 = {
...
}
我想创建一个新用户,但设置它为一个空对象:
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
我怎么做呢?我不希望变量为空。
当前回答
你可以在typescript中这样做
const _params = {} as any;
_params.name ='nazeh abel'
由于typescript的行为不像javascript,所以我们必须使类型为任何,否则它将不允许你动态地分配一个对象的属性
其他回答
这取决于你想做什么。类型是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
}
注意,使用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,不能写为>,所以实际上你的user类型要么是空对象,要么是user
const user : User | Record<string, never> = {};
如果
type User = {
Username?: string;
Email?: string;
}
你可以声明一个空对象或者只有一个字段(例如,只有Username);在这种情况下,您将不会出现错误,这可能是一个问题。
我将更喜欢{}作为用户版本。
如果你声明了一个空对象,然后再赋值,那么你可以认为这些值是可选的(可能存在,也可能不存在),所以只要用问号将它们输入为可选的:
type User = {
Username?: string;
Email?: string;
}