Javascript 如何使用代理定义属性
我有一个类,其中包含一个代理,如下所示:Javascript 如何使用代理定义属性,javascript,typescript,Javascript,Typescript,我有一个类,其中包含一个代理,如下所示: export class Row<T extends ModelItems> { private _row: T = <T>{} public constructor(rowItems?: T) { if (rowItems) { this._row = rowItems } return new Proxy(this, { get: function (target, prop) {
export class Row<T extends ModelItems> {
private _row: T = <T>{}
public constructor(rowItems?: T) {
if (rowItems) { this._row = rowItems }
return new Proxy(this, {
get: function (target, prop) {
return (<any>target)[prop] || target._row[prop] || ''
}
/* set(): snipped */
}
}
然而,这似乎没有任何帮助,除了告诉我我的方法没有正确定义之外。看起来您希望
行
的实例本身也是t
;是这样吗?TypeScript不允许您执行类似于类行实现t
的操作,它本身也不会轻易推断出这一点。相反,您可以执行以下操作:
export class _Row<T> {
// ... your definition above
}
// Row type alias
export type Row<T extends ModelItems> = _Row<T> & T;
// Row value alias
export const Row = _Row as {
new <T>(rowItems?: T): Row<T>
prototype: _Row<{}>
}
如果试图表示不同的内容,如
行
的行为类似于T
的所有键,但可能具有空字符串属性,则可以用以下内容替换//行类型别名
:
// Row type alias
export type Row<T extends ModelItems> = _Row<T> &
{[K in keyof T]: T[K] | ''};
//行类型别名
导出类型行=\u行&
{[K in keyof T]:T[K]|'''};
并验证其行为是否符合预期:
declare const u: User;
let row = new Row(u); // inferred as Row<User>
row.id // number || ''
声明常量u:用户;
让行=新行(u);//推断为行
row.id//number | |“”
希望有帮助;祝你好运 看起来您希望
Row
的实例本身也是T
;是这样吗?TypeScript不允许您执行类似于类行实现t
的操作,它本身也不会轻易推断出这一点。相反,您可以执行以下操作:
export class _Row<T> {
// ... your definition above
}
// Row type alias
export type Row<T extends ModelItems> = _Row<T> & T;
// Row value alias
export const Row = _Row as {
new <T>(rowItems?: T): Row<T>
prototype: _Row<{}>
}
如果试图表示不同的内容,如
行
的行为类似于T
的所有键,但可能具有空字符串属性,则可以用以下内容替换//行类型别名
:
// Row type alias
export type Row<T extends ModelItems> = _Row<T> &
{[K in keyof T]: T[K] | ''};
//行类型别名
导出类型行=\u行&
{[K in keyof T]:T[K]|'''};
并验证其行为是否符合预期:
declare const u: User;
let row = new Row(u); // inferred as Row<User>
row.id // number || ''
声明常量u:用户;
让行=新行(u);//推断为行
row.id//number | |“”
希望有帮助;祝你好运 有没有更干净的方法?我不需要做什么
行的项目实例
我想做行的项目实例
和新行
而不是新行
你可以做行的项目实例
和新行
。试试看,嗯。。。奇怪。我在类\u行中有public get length
,当我这样做时:行和&item.length>0的项实例是说行上不存在length
我还有一个类似这样的构造函数:public构造函数(行:Row[]| Row)
如果我传递的项目是行的实例
我会得到一个错误,如果我传递的项目是行的实例
我不会得到错误。错误:else if(i instanceof Row){this.\u items=new DataSet(i)}
不是错误:else if(i instanceof Row){this.\u items=new DataSet(i)},错误是:类型为'this'的参数不能赋值给类型为'Row | Row[]的参数。
有更干净的方法吗?我不需要做什么行的项目实例
我想做行的项目实例
和新行
而不是新行
你可以做行的项目实例
和新行
。试试看,嗯。。。奇怪。我在类\u行中有public get length
,当我这样做时:行和&item.length>0的项实例是说行上不存在length
我还有一个类似这样的构造函数:public构造函数(行:Row[]| Row)
如果我传递的项目是行的实例
我会得到一个错误,如果我传递的项目是行的实例
我不会得到错误。错误:else if(i instanceof Row){this.\u items=new DataSet(i)}
不是错误:else if(i instanceof Row){this.\u items=new DataSet(i)},错误是:类型为'this'的参数不能赋值给类型为'Row | Row[]的参数。