[英]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'.
没有修复核心类型定义,有没有办法在我的代码中解决这个问题?
您可以使用实用程序类型Omit
: https ://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 无法装入布尔孔,反之亦然
您可以将此实用程序类型添加到您的项目中:
type Modify<T, R> = Omit<T, keyof R> & R;
然后像这样使用它:
type ISelectionGridOptions = Modify<IGridOptions, {
isRowSelectable: (row: IGridRowOf<Profile>) => boolean;
}>
您可以使用优秀的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.