值=键的Typescript接口

时间:2019-09-30 22:24:19

标签: typescript

这里是新的打字稿用户。

我们经常声明我们的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?还是我只是在这里使用打字稿完全错误。

1 个答案:

答案 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

Playground