为什么已经定义的typescript类选项仍然可能未定义?

c2e8gylq  于 2023-05-19  发布在  TypeScript
关注(0)|答案(1)|浏览(252)

我正在尝试为一个类预定义(静态)选项:

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()总是会被调用(否则库不能被使用),所以对这些变量包只使用!操作符可以吗?

du7egjpx

du7egjpx1#

如果Draggable.options总是完全初始化(不管用户提供的选项如何),您可以让 its 类型不包括undefined,然后让用户传递一个Partial。例如,你可以写

interface Options {
    // Note: Everything is required
    startTimeLimit: number;
    throttlePeriod: number;
}

然后定义静态字段Draggable.options的类型为Options(因此所有内容都完全存在并定义)。那么函数的签名可以是

static init(parentId: string, draggables: NodeList, options: Partial<Options>)

相关问题