Тип "строка" не может быть назначен типу "строка" |"string" 'пытается вызвать объект литерал - PullRequest
0 голосов
/ 04 июня 2018

Ну, я пытаюсь сделать динамический метод в зависимости от let terrain (string), который вы увидите в коде, расположенном внизу этого поста, поэтому я могу создавать новые 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 extends Terrain), и у них есть метод create.

Проблема заключается в том, чтоЯ пытаюсь выбрать и создать конкретную местность.Вот код:

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

Когда я запускаю этот код, я получаю эту ошибку: Тип 'строка' не может быть назначен типу '' Plains '|"Горы" '.

Что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Typescript выводит, что «terrain» является строкой, укажите тип «terrain» в качестве ключа TERR_CREATE.

Или объявить как постоянное.

0 голосов
/ 04 июня 2018

Этот код не компилируется для меня (как правило, вы должны опубликовать Минимальный, Полный и Проверяемый пример , чтобы получить лучшую помощь). Редактировать: спасибо за обновление вашего кода.

Я бы сказал, что ваша проблема в том, что 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"

Посмотри на игровую площадку

, а остальное должно сработать.

Надеюсь, это поможет.Удачи.

...