我试图在TypeScript中模拟类似地图的行为,并获得可能值的代码完成。我仅限于TypeScript 1.8。
catalog.ts
export declare type CATALOG = 'CATALOG1' | 'CATALOG2' | 'CATALOG3';
export const CATALOGS: { [catalog: string]: CATALOG } = {
CATALOG1: 'CATALOG1',
CATALOG2: 'CATALOG2',
CATALOG3: 'CATALOG3'
};
example.ts
import { CATALOGS } from './catalog';
class MyClass {
catalogs = CATALOGS;
constructor() {
CATALOGS.CATALOG1; // error
this.catalogs.CATALOG1; // error
}
}
这导致以下错误:
{[catalog:string]类型上不存在属性'CATALOG1': “CATALOG1”| “CATALOG2”| “CATALOG3”}
有人可以详细说明吗?
答案 0 :(得分:2)
你所描述的并不是一个类似地图的行为",你可以通过地图执行以下操作:
CATALOGS.get("CATALOG1");
这基本上就是你所定义的:{ [catalog: string]: CATALOG }
您可以像这样访问它:
let a = CATALOGS["CATALOG1"];
如果你想像以前那样访问它,那么它应该是:
interface Catalogs {
CATALOG1: CATALOG;
CATALOG2: CATALOG;
CATALOG3: CATALOG;
}
export const CATALOGS: Catalogs = {
CATALOG1: 'CATALOG1',
CATALOG2: 'CATALOG2',
CATALOG3: 'CATALOG3'
};
let a = CATALOGS.CATALOG1;