在打字稿中使用与号运算符
Using the ampersand operator in typescript
如何创建 AccessGroup 类型的变量
declare class AccessGroup {
id: number;
active: boolean;
display_name: string;
description: string;
access_group_features: [];
created_at?: Date;
created_by?: string;
updated_at?: Date;
updated_by?: string;
static fromJSON(json: any): any;
toJSON(): this & {
access_group_features: any;
};
}
我想的是我们可以这样做
let x:AccessGroup={
id:1,
active:false,
display_name:'',
description:'',
access_group_features:[]
toJSON(): ?
}
但它给出了一个错误,因为将某些东西分配给 toJSON() 是强制性的并且不知道这一点,除了如果我没记错的话 & 就像一个交集一样工作
有人可以举例说明如何为变量定义 toJSON()
您只需像在 class 中一样实施它。这意味着你return一个对象是基于对象运行的方法,加上一个额外的属性.
看起来像 { ...this, extraProp: 'whatever' }
declare class AccessGroup {
id: number;
active: boolean;
display_name: string;
toJSON(): this & {
access_group_features: any;
};
}
let x: AccessGroup = {
id: 123,
active: true,
display_name: 'Testing 123',
toJSON() {
return {
...this,
toJSON: this.toJSON, // Make typescript happy
access_group_features: 'Test'
}
}
}
只要您像 x.toJSON()
这样调用该方法,那么 this
就会成为 x
对象,一切都会正常工作。
正如您可能注意到的那样,我需要显式传递 toJSON
方法,因为 ...this
中没有包含该方法。我相信这是因为在 class 中,方法不可枚举。方法存储在 class 原型中,因为它们不会随实例改变。这意味着打字稿不相信 toJSON
将是 { ...this }
的 属性
至少我认为,这个有点棘手。
但是在 toJSON()
的 return 中有任何功能可能也不对。所以你可能根本不想包括它。
如果您将类型更改为:
toJSON(): Omit<this, 'toJSON'> & {
access_group_features: any;
};
那你可以省去方法:
toJSON() {
return { ...this, access_group_features: 'Test' }
}
但是创建一个普通对象来实现带有方法的 class 接口并不理想。如果你真的能做到 class 然后去做 new AccessGroup()
你的生活可能会容易得多。
对@Alex Wayne 上面回答的内容做一个小改动。
原来的问题在 AccessGroup 中有另一个 属性,称为 access_group_features,它是一个数组
declare class AccessGroup {
id: number;
active: boolean;
display_name: string;
description: string;
access_group_features: [];
created_at?: Date;
created_by?: string;
updated_at?: Date;
updated_by?: string;
static fromJSON(json: any): any;
toJSON(): this & {
access_group_features: any;
};
}
So the access_group property in toJSON() member function should also
be of the type array ( any other type throws an error as ampersand
operator in typescript intersects the properties and hence should be
of the same type)
toJSON(): this & {
access_group_features: []; /* this is probably because of strict type checking in typescript */
};
所以创建的变量看起来像这样:
let x: AccessGroup = {
id: 123,
active: true,
display_name: 'Testing 123',
access_group_features:[],
toJSON() {
return {
...this,
toJSON: this.toJSON,
access_group_features: []
}
}
}
如何创建 AccessGroup 类型的变量
declare class AccessGroup {
id: number;
active: boolean;
display_name: string;
description: string;
access_group_features: [];
created_at?: Date;
created_by?: string;
updated_at?: Date;
updated_by?: string;
static fromJSON(json: any): any;
toJSON(): this & {
access_group_features: any;
};
}
我想的是我们可以这样做
let x:AccessGroup={
id:1,
active:false,
display_name:'',
description:'',
access_group_features:[]
toJSON(): ?
}
但它给出了一个错误,因为将某些东西分配给 toJSON() 是强制性的并且不知道这一点,除了如果我没记错的话 & 就像一个交集一样工作
有人可以举例说明如何为变量定义 toJSON()
您只需像在 class 中一样实施它。这意味着你return一个对象是基于对象运行的方法,加上一个额外的属性.
看起来像 { ...this, extraProp: 'whatever' }
declare class AccessGroup {
id: number;
active: boolean;
display_name: string;
toJSON(): this & {
access_group_features: any;
};
}
let x: AccessGroup = {
id: 123,
active: true,
display_name: 'Testing 123',
toJSON() {
return {
...this,
toJSON: this.toJSON, // Make typescript happy
access_group_features: 'Test'
}
}
}
只要您像 x.toJSON()
这样调用该方法,那么 this
就会成为 x
对象,一切都会正常工作。
正如您可能注意到的那样,我需要显式传递 toJSON
方法,因为 ...this
中没有包含该方法。我相信这是因为在 class 中,方法不可枚举。方法存储在 class 原型中,因为它们不会随实例改变。这意味着打字稿不相信 toJSON
将是 { ...this }
至少我认为,这个有点棘手。
但是在 toJSON()
的 return 中有任何功能可能也不对。所以你可能根本不想包括它。
如果您将类型更改为:
toJSON(): Omit<this, 'toJSON'> & {
access_group_features: any;
};
那你可以省去方法:
toJSON() {
return { ...this, access_group_features: 'Test' }
}
但是创建一个普通对象来实现带有方法的 class 接口并不理想。如果你真的能做到 class 然后去做 new AccessGroup()
你的生活可能会容易得多。
对@Alex Wayne 上面回答的内容做一个小改动。
原来的问题在 AccessGroup 中有另一个 属性,称为 access_group_features,它是一个数组
declare class AccessGroup {
id: number;
active: boolean;
display_name: string;
description: string;
access_group_features: [];
created_at?: Date;
created_by?: string;
updated_at?: Date;
updated_by?: string;
static fromJSON(json: any): any;
toJSON(): this & {
access_group_features: any;
};
}
So the access_group property in toJSON() member function should also be of the type array ( any other type throws an error as ampersand operator in typescript intersects the properties and hence should be of the same type)
toJSON(): this & {
access_group_features: []; /* this is probably because of strict type checking in typescript */
};
所以创建的变量看起来像这样:
let x: AccessGroup = {
id: 123,
active: true,
display_name: 'Testing 123',
access_group_features:[],
toJSON() {
return {
...this,
toJSON: this.toJSON,
access_group_features: []
}
}
}