这里是新的打字稿用户。
我们经常声明我们的redux动作和其他静态常量,例如(js):
export const notificationTypes = {
WELCOME: "WELCOME",
LOGGED_IN: 'LOGGED_IN',
NEW_EMAIL: 'NEW_EMAIL',
};
我正在尝试使用打字稿做同样的事情:
export const notificationTypes = {
WELCOME: "WELCOME",
LOGGED_IN: 'LOGGED_IN',
NEW_EMAIL: 'NEW_EMAIL',
};
export type NotificationType = keyof typeof notificationTypes;
这是尝试使用新类型的尝试:
import {notificationTypes, NotificationType} from "./notificationTypes"
interface Notification {
type:NotificationType
}
//no errors
const firstNotificationTest:Notification={
type:"WELCOME"
}
//error type 'string' is not assignable to type "WELCOME" | "LOGGED_IN" | "NEW_EMAIL"
const secondtNotificationTest:Notification={
type:notificationTypes.WELCOME
}
如您所见,我不能使用notificationTypes.WELCOME,而必须使用“ WELCOME”。这有点破坏了设置这些常量的全部目的。
是否可以与Notification
接口以允许任何notificationTypes
值?还是接口notificationTypes
本身,以便知道value = key
?还是我只是在这里使用打字稿完全错误。
答案 0 :(得分:3)
您可以添加const assertion以将notificationTypes
的属性缩小为字符串文字类型。
export const notificationTypes = {
WELCOME: "WELCOME",
LOGGED_IN: 'LOGGED_IN',
NEW_EMAIL: 'NEW_EMAIL',
} as const
这还有一个好处,成员被标记为readonly
,因此在正常的类型用法下不会发生这种情况:
notificationTypes.LOGGED_IN = "duuuhh"
,因此您可以有效地使用notificationTypes
代替conventional enum。