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()
但我想保留原始的对象结构。
谢谢!
使用内置 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)