我正在尝试为一个类预定义(静态)选项:
interface Options {
startTimeLimit?: number;
throttlePeriod?: number;
....
....
}
export class Draggable extends DragElement{
static init(parentId:string, draggables:NodeList, options:Options) {
Draggable.options = {
startTimeLimit: 250,
throttlePeriod: 100,
....
....
}
Object.assign(Draggable.options, options);
....
....
}
....
....
}
但是我得到了一个类型错误
“Draggable.options.startTimeLimit”可能为“undefined”
从startTimeLimit
的使用(以及这些选项的所有其他使用):
var now = e.timeStamp;
if (now - Draggable.lastStartDragTime < Draggable.options.startTimeLimit) {
// debounce
return false;
}
据我所知,?
操作符使用户可以提供选项或不提供选项,但既然我提供了默认值,为什么我会得到这个错误?
编辑
在仔细考虑了@johnrsharpe的评论之后,我现在明白TS不知道是否调用过init
,所以不知道是否定义了变量。因此出现了编译错误。但这仍然让我想知道如何实现我想要的-即。以允许客户端不提供各种选项。
因为我知道init()
总是会被调用(否则库不能被使用),所以对这些变量包只使用!
操作符可以吗?
1条答案
按热度按时间du7egjpx1#
如果
Draggable.options
总是完全初始化(不管用户提供的选项如何),您可以让 its 类型不包括undefined
,然后让用户传递一个Partial
。例如,你可以写然后定义静态字段
Draggable.options
的类型为Options
(因此所有内容都完全存在并定义)。那么函数的签名可以是