我找了很多,但没有找到。我的代码如下。
我创建了一个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>
。谢谢您的关注。