Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用代理定义属性_Javascript_Typescript - Fatal编程技术网

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[]的参数。