TypeScript认为这样假设是不安全的
for..in
键正是在类型中定义的键,因为在JavaScript中所有对象都是打开的。
您可以使用断言消除编译错误:
for (let name in routes) {
routes[name as RouteName]; // no error
}
或者,我会把你的两种方法结合起来。您可以定义
routes
在执行此操作时,将密钥提取为
RouteName
,但也可以
RouteDefinition
并在要映射路由时,将路由分配给索引类型(可以使用对新变量或函数参数的断言来完成):
interface RouteDefinition {
path: string;
page: string;
}
const routes = {
home: { path: '/', page: 'home' },
profile: { path: '/profile', page: 'users/profile' }
}
type RouteName = keyof typeof routes;
mapRoutes(routes);
function mapRoutes(routes: { [key: string]: RouteDefinition }) {
for (let name in routes) {
routes[name] // no error
}
}
如果您的
路线
文字不满足
路由定义
(缺少一个键,键的类型错误)然后你会在分配站点出错,即
mapRoutes(routes)
在上面