Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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 如何将表行映射为typescript中不同接口的潜在行?_Javascript_Typescript - Fatal编程技术网

Javascript 如何将表行映射为typescript中不同接口的潜在行?

Javascript 如何将表行映射为typescript中不同接口的潜在行?,javascript,typescript,Javascript,Typescript,如果我有以下接口 export interface IUserRow { id: string, state: string, email: string, } export interface ITableRow { id: string, [key: string]: any; } export type Rows = ITableRow | IUserRow; // different row types, such as IPostRow to

如果我有以下接口

export interface IUserRow {
    id: string,
    state: string,
    email: string,
}

export interface ITableRow {
    id: string,
    [key: string]: any;
}

export type Rows = ITableRow | IUserRow; // different row types, such as IPostRow to be added later
我正在映射一个表

const instanceOfUser = (object: any): object is IUserRow => 'member' in object;

const determineOnRowClick = (row: Rows, onRowClick: any) => {
  if (instanceOfUser(row)) {
    // never entered, always returns false
    const rowId = row.id;
    const view = row.state === 'Active' ? 'edit' : 'add';

    return onRowClick(rowId, view);
  }

  return onRowClick(row.id);
}
. . .
<TableBody className={tableClasses.tbody}>
  {rows.map((row: Rows, i: number) => (
    <TableRow
      onClick={() => determineOnRowClick(row, onRowClick ?? null)}
      key={row.id || i}
    >
. . .
永远不会进入。对于typescript,是否可以将map方法中的当前元素声明为可以是多个接口成员的元素?如果是这样,我如何才能做到这一点?

试试:

const determineOnRowClick = (row: Rows, onRowClick: any) => {
  if ((row as IUserRow).email) {
    const rowId = row.id;
    const view = row.state === 'Active' ? 'edit' : 'add';
    return onRowClick(rowId, view);
  }

  return onRowClick(row.id);
}

如果
没有设置
电子邮件
,这将计算为
。您需要使用
…as IUserRow
来检查这一点,以便让typescript知道,可能存在一个属性
电子邮件

,这是有效的!然而,问题是,
if((行为IUserRow.email)
如果我可以做
if(行.email)
?@MikeK在开发过程中,ts会给你一个错误,比如
属性“email”在类型“ITableRow
或smth上不存在。类似,因为行的类型为
IUserRow
ITableRow
email
仅存在于
IUserRow
const determineOnRowClick = (row: Rows, onRowClick: any) => {
  if ((row as IUserRow).email) {
    const rowId = row.id;
    const view = row.state === 'Active' ? 'edit' : 'add';
    return onRowClick(rowId, view);
  }

  return onRowClick(row.id);
}