好吧,我正在尝试根据你在本帖子底部的代码中看到的let terrain(字符串)做一个动态方法,所以我可以创建新的Terrains,只在TERR_CREATE和TERRAINS_CREATE上添加它们。代码是
export class Plains {
static create(position: string) {
return 0;
}
}
export class Mountain {
static create(position: string) {
return 0;
}
}
export interface TERR_CREATE {
Plains: typeof Plains;
Mountains: typeof Mountain;
}
export const TERRAINS_CREATE : TERR_CREATE = {
Plains : Plains,
Mountains: Mountain,
}
对象文字中的值是每个地形的类(例如Plains扩展Terrain类),它们有一个create方法。
问题是当我尝试选择并创建特定地形时。这是代码:
let newPosition = "12";
let terrain = "Plains";
let sel : (keyof TERR_CREATE) = terrain;
TERRAINS_CREATE[sel].create(newPosition);
当我运行该代码时,我收到此错误:输入' string'不能分配到'"平原" | "山"'
我该怎么办?
答案 0 :(得分:4)
该代码不为我编译(您通常应发布Minimal, Complete, and Verifiable example以获得最佳帮助。)编辑:感谢您更新代码。
我说你的问题是terrain
扩展到string
,因为你正在使用let
来声明它。由于通过let
声明的变量可以更改其值,通常您不会说let terrain = "Plains"
,除非您计划稍后更改 terrain
的值。因此编译器推断terrain
是string
。如果你不喜欢这个推论,你可以告诉编译器keyof TERR_CREATE
是这样的:
let terrain: keyof TERR_CREATE = "Plains";
然后其余的应该工作。或者,如果您永远不想更改terrain
的值,可以使用const
声明,TypeScript将推断为最窄的类型(在这种情况下为字符串文字):
const terrain = "Plains"; // inferred as string literal "Plains"
其他应该有效。
希望有所帮助。祝你好运。
答案 1 :(得分:0)
Typescript推断“terrain”是字符串,将“terrain”的类型指定为TERR_CREATE的key。
或者声明为const。