Typescript будет выводить строковые литеральные типы только тогда, когда вы присваиваете его const
.Когда вы создаете объектные литералы, компилятор выведет string
для строковых констант, а не для строковых литералов.Если вы присваиваете литерал объекта непосредственно чему-то, что требует строкового литерального типа, это нормально, так как в этом случае компилятор просто проверяет, что строковая константа присваивается строковому литеральному типу.
Простое решение здесьдля указания аргумента типа на map
, это все равно сохранит проверки компилятором возвращаемого значения из map
:
const tasks = ["apples", "pears"].map<TaskDefinition>(i => {
return {
name: i,
task: i,
taskType: 'SIMPLE'
};
})
или для использования утверждения типа в строке для ожидаемого строкового литерала типа:
const tasks:TaskDefinition[] = ["apples", "pears"].map(i => {
return {
name: i,
task: i,
taskType: 'SIMPLE' as 'SIMPLE'
};
})
Редактировать Начиная с машинописного текста 3.4 ( PR ), вы также можете использовать утверждение as const
для получения строкового литерала типа:
const tasks:TaskDefinition[] = ["apples", "pears"].map(i => {
return {
name: i,
task: i,
taskType: 'SIMPLE' as const
};
})
Конец редактирования
Вы также можете ввести assert непосредственно в возвращаемое значение, но это отключит некоторые проверки возвращаемого значения:
const tasks:TaskDefinition[] = ["apples", "pears"].map(i => {
return <TaskDefinition>{
wrongValue: "", // no error since we are asserting
name: i,
task: i,
taskType: 'SIMPLE'
};
})