使用Object.keys()时保留类型

Smx*_*Cde 5 static-typing typescript

我有一个带有键入键的对象,我们称它们为状态(StatusesType)。我需要遍历对象,并将键传递给需要相同类型参数的某些方法StatusesType,让它成为statusPrinter()

type StatusesType = 'PENDING' | 'APPROVED' | 'REJECTED';
type SomeMap = {
    [key in StatusesType]?: number
}

const STATUSES: SomeMap = {
    PENDING: 5,
    REJECTED: 2,
};

function statusPrinter(val: StatusesType) {
    console.log('- ', val);
}

Object.keys(STATUSES).forEach(status => {
    statusPrinter(status);
});
Run Code Online (Sandbox Code Playgroud)

但是当我调用statusPrinter(status);TypeScript返回此错误时

error TS2345: Argument of type 'string' is not assignable to parameter of type 'StatusesType'.

如何传递此密钥保存类型?

我知道我可以为此强制执行TS,statusPrinter(<StatusesType>status);但是我认为这是我应该做的最后一件事,我更喜欢本机解决方案。

更新:如果无法使用Object.keys()保留类型遍历对象键-我有哪些选项?有没有一种方法可以遍历所有键保留类型,如果可以,哪种方法最好?我没有固定,Object.keys()但我想保留原始的对象结构。

谢谢!

ide*_*xer 7

使用内置 ES2015Map类的简短且类型安全的解决方案:

type StatusesType = 'PENDING' | 'APPROVED' | 'REJECTED';

const STATUSES = new Map<StatusesType, number>([
    ['PENDING', 5],
    ['REJECTED', 2],
]);

function statusPrinter(val: StatusesType) {
    console.log('- ', val);
}

STATUSES.forEach((_, status) => statusPrinter(status));
Run Code Online (Sandbox Code Playgroud)