类型 'string' 不可分配给类型 '"string" | "string"' 尝试调用对象字面量

Type 'string' is not assignable to type '"string" | "string"' trying to call object literal

好吧,我正在尝试根据 let 地形(字符串)执行动态方法,您将在位于此 post 底部的代码中看到,因此我可以创建新的地形,只需添加他们在 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,
}

对象字面量中的值是每个地形的class,例如class Plains extends Terrain,它们有一个创建方法。

问题是当我尝试 select 并创建特定地形时。这是代码:

let newPosition = "12";
let terrain = "Plains";
let sel : (keyof TERR_CREATE) = terrain;
TERRAINS_CREATE[sel].create(newPosition);

当我 运行 该代码时,我收到此错误:类型 'string' 不可分配给类型 '"Plains" | "Mountains"'.

我能做什么?

该代码无法为我编译(您通常应该 post 一个 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

其余的应该工作。

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

Typescript 推断"terrain" 是字符串,指定"terrain" 的类型为keyof TERR_CREATE。

或者声明为常量。