为什么自动完成停止在 TypeScript 类型的对象中工作?

Den*_*nko 8 webstorm typescript visual-studio-code

我在一个对象中有一个路由列表,想将它导入到其他文件中,并对对象属性进行自动完成。

索引.ts

import allRoutes from './routes';

allRoutes.routeHome;
Run Code Online (Sandbox Code Playgroud)

路由.ts

const allRoutes = {
  routeHome: '',
  routePortfolio: 'portfolio'
};

export default allRoutes; 
Run Code Online (Sandbox Code Playgroud)

一切正常。但是,如果我将类型添加到我的 allRoutes 以进行这样的类型检查:

const allRoutes: {[key: string]:string} = {
  routeHome: '',
  routePortfolio: 'portfolio'
};
Run Code Online (Sandbox Code Playgroud)

或者像这样:

interface IRoutes {
    [key: string]: string;
}

const allRoutes: IRoutes = {
    routeHome: '',
    routePortfolio: 'portfolio'
};
Run Code Online (Sandbox Code Playgroud)

一切都崩溃了

我在 WebStorm 或 VSCode 中尝试过这个。如果我为对象属性添加类型 - 自动完成停止工作。为什么会发生?我该如何解决这个问题?

Mat*_*hen 13

一旦使用 type 初始化常量{ [key: string]: string },原始类型就会丢失。如果您想保留原始类型但检查它是否可分配给{ [key: string]: string },您可以这样做:

function asStrings<T extends { [key: string]: string }>(arg: T): T {
  return arg;
}

const allRoutes = asStrings({
  routeHome: '',
  routePortfolio: 'portfolio'
});
Run Code Online (Sandbox Code Playgroud)

有一个不需要调用函数的解决方案的建议