类型 'undefined' 不能用作索引类型。部分<Class>未定义?



我找了很多,但没有找到。我的代码如下。

我创建了一个alertify服务,但我得到以下错误:"Type 'undefined' cannot be used as an index type. Partial<Class> undefined ?">

我不明白为什么代码检测到我的索引类型为'undefined'。

import { Injectable } from '@angular/core';
declare let alertify: any;
@Injectable({
providedIn: 'root'
})
export class AlertifyService {
constructor() { }
message(message: string, options: Partial<AlertifyOptions>) {
alertify.set('notifier', 'position', options.position);
alertify.set('notifier', 'delay', options.delay);
alertify[options.messageType](message);
}
}
export class AlertifyOptions {
messageType: AlertifyMessageType = AlertifyMessageType.Success;
position: AlertifyPositions = AlertifyPositions.BottomRightCenter;
delay: number = 3;
dismissOthers: boolean = false;
}
export enum AlertifyMessageType {
Success = "success",
Warning = "warning",
Message = "message",
Error = "error",
Notifier = "notifier"
}
export enum AlertifyPositions {
TopRight = "top-right",
TopCenter = "top-center",
Topleft = "top-left",
BottomRight = "bottom-right",
BottomRightCenter = "bottom-center",
BottomRightBottom = "bottom-right"
}

输入图片描述

tl;dr在尝试使用Partial类型的属性之前,请确保null检查


当你在TypeScript中使用Partial类型时,你有效地采用了一个现有的类型,并将每个属性标记为可选的。TypeScript中的可选类型在大多数情况下都相当于键可以是undefined

例如:

interface SomeObject {
key1: string;
key2: number;
}
type PartialSomeObject = Partial<SomeObject>
// equivalent to
interface PartialSomeObject {
key1?: string;
key2?: number;
}
// or
interface PartialSomeObject {
key1: string | undefined;
key2: number | undefined;
}

因为键是可选的,本质上这意味着它们都不是强制性的。一个完全有效的PartialSomeObject赋值如下:

const somePartialObject: PartialSomeObject = {} // all optional keys are missing

回到您的示例,您有以下内容:

message(message: string, options: Partial<AlertifyOptions>) {
alertify.set('notifier', 'position', options.position);
alertify.set('notifier', 'delay', options.delay);
alertify[options.messageType](message);
}

在这种情况下,您将options属性传递为Partial<AlertifyOptions>,这意味着(如上所述)options的这个值可能不包含任何你在块中使用的键。为了让TypeScript允许你使用下游的options信息,你需要证明你感兴趣的键确实存在

当你试图使用options.messageType作为alertify类/对象的索引时,TypeScript会说如果如果这个值是undefined,它就不可能被用作索引。即alertify[undefined]是无效的语法。

你需要确保options.messageType而不是undefined,然后再使用。这可以通过简单的null检查来实现:
message(message: string, options: Partial<AlertifyOptions>) {
// ...
if (options.messageType) {
alertify[options.messageType](message);
}
}
// or one-liner
message(message: string, options: Partial<AlertifyOptions>) {
// ...
options.messageType && alertify[options.messageType](message);
}

注意:我假设options.messageType的类型是alertify类/对象上可能的键的联合。如果不是这种情况,无论是否有

上面的空检查,操作都将无效。

我通过替换
Partial<AlertifyOptions>来解决这个问题Required<AlertifyOptions>。谢谢您的关注。

相关内容

  • 没有找到相关文章

最新更新