繁体   English   中英

如何覆盖打字稿中的属性?

[英]How do I override a property in typescript?

由于当前的语言限制,这可能是不可能的,但我使用的是最新的 TS (1.8.10),并且遇到了 ui-grid 类型的问题。 IGridOptions上的isRowSelectable属性被定义为一个可选的布尔值,但文档说它是一个函数(确实如此)。 我正在尝试将布尔属性覆盖为返回布尔值的函数。

通常,我只是扩展打字界面并做我需要的事情,但在这种情况下这不起作用。 这是我所拥有的:

interface ISelectionGridOptions extends IGridOptions {
  isRowSelectable: (row: IGridRowOf<Profile>) => boolean;
}

IGridOptions中的相关字段是:

export interface IGridOptions {
  ...
  isRowSelectable?: boolean
  ...
}

我得到的错误是:

(41,11): error TS2430: Interface 'ISelectionGridOptions' incorrectly extends interface 'IGridOptionsOf<any>'.
  Types of property 'isRowSelectable' are incompatible.
    Type '(row: IGridRowOf<Profile>) => boolean' is not assignable to type 'boolean'.

没有修复核心类型定义,有没有办法在我的代码中解决这个问题?

您可以使用实用程序类型Omithttps ://www.typescriptlang.org/docs/handbook/utility-types.html#omittk

interface ISelectionGridOptions extends Omit<IGridOptions, 'isRowSelectable'> {
  isRowSelectable: (row: IGridRowOf<Profile>) => boolean;
}

如果类型定义不正确,则不能使用覆盖来修复它们 - 类型系统正确地将其视为错误。 在类型化语言中,防止子类更改类型签名是一件好事。 这里的问题是损坏的类型定义。 如果修复 def 不切实际,并且问题仅出现在代码中的几个地方,则可以使用强制转换为any来禁用类型检查,直到修复 defs:

var foo = <boolean> (<any>bar).isRowSelectable(args);
bar.isRowSelectable = <any>foo; 

只需发表评论,解释发生了什么。 当然,最好修复类型 defs。

注意:它会中断,就像错误所说的那样,因为函数不能分配给布尔值。 函数 peg 无法装入布尔孔,反之亦然

TS 3.5+ 的更新

您可以将此实用程序类型添加到您的项目中:

type Modify<T, R> = Omit<T, keyof R> & R;

然后像这样使用它:

type ISelectionGridOptions = Modify<IGridOptions, {
  isRowSelectable: (row: IGridRowOf<Profile>) => boolean;
}>

TS Playground 中的演示

延伸阅读

您可以使用优秀的type-fest包中的Merge实用程序来覆盖或覆盖类型上的任何属性,无论它是原始类型:

import type {Modify} from 'type-fest'

type SelectionGridOptions = Modify<GridOptions, {
  isRowSelectable: (row: GridRow<Profile>) => boolean;
}>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM