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)
这是一个适合你的工作示例.
noo*_*ob7 54
空对象可以写为Record<string,never>,因此实际上您的 user 类型要么是空对象,要么是 User
const user : User | Record<string, never> = {};
Run Code Online (Sandbox Code Playgroud)
pix*_*pax 17
真的取决于你想要做什么.类型是typescript中的文档,因此您希望显示在创建类型时如何使用此事物的意图.
使所有属性可选
type User = {
attr0?: number
attr1?: string
}
Run Code Online (Sandbox Code Playgroud)
type User = {
...
}
let u1: User = null;
Run Code Online (Sandbox Code Playgroud)
虽然,实际上,如果要说明User对象之前可以知道将分配给它的内容,那么您可能希望不做let u1:User任何赋值.
真的,打字稿的前提是确保你符合你在类型中勾勒出的心理模型,以避免犯错.如果您想逐个添加对象,这是TypeScript试图让您不要做的习惯.
更有可能的是,您想要创建一些局部变量,然后在准备好成为完全用户时分配给包含用户的变量.这样你永远不会留下部分形成的用户.那些事情很糟糕.
let attr1: number = ...
let attr2: string = ...
let user1: User = {
attr1: attr1,
attr2: attr2
}
Run Code Online (Sandbox Code Playgroud)
不要用作{}类型。{}实际上意味着“任何非空值”。
Record<string, never>改为。object改为。unknown改为。请注意, 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)
| 归档时间: |
|
| 查看次数: |
39679 次 |
| 最近记录: |