输入' string'不能分配类型'"字符串" | "串"'试图调用object literal

时间:2018-06-04 19:23:55

标签: javascript typescript object-literal

好吧,我正在尝试根据你在本帖子底部的代码中看到的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'不能分配到'"平原" | "山"'

我该怎么办?

2 个答案:

答案 0 :(得分:4)

该代码不为我编译(您通常应发布Minimal, Complete, and Verifiable example以获得最佳帮助。)编辑:感谢您更新代码。

我说你的问题是terrain扩展到string,因为你正在使用let来声明它。由于通过let声明的变量可以更改其值,通常您不会说let terrain = "Plains",除非您计划稍后更改 terrain的值。因此编译器推断terrainstring。如果你不喜欢这个推论,你可以告诉编译器keyof TERR_CREATE是这样的:

let terrain: keyof TERR_CREATE = "Plains";

See it in the Playground

然后其余的应该工作。或者,如果您永远不想更改terrain的值,可以使用const声明,TypeScript将推断为最窄的类型(在这种情况下为字符串文字):

const terrain = "Plains"; // inferred as string literal "Plains"

See it in the Playground

其他应该有效。

希望有所帮助。祝你好运。

答案 1 :(得分:0)

Typescript推断“terrain”是字符串,将“terrain”的类型指定为TERR_CREATE的key。

或者声明为const。