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);
}