Typescript выводит только строковые литеральные типы в определенной ситуации.Свойство, как правило, не является одним из таких случаев, если только нет дополнительных обстоятельств, чтобы намекнуть литеральный тип для свойства.(это не имеет ничего общего с троичным оператором).
В Typescript 3.4 (не выпущен на момент написания, но уже доступен как typescript@next
в npm
) вы сможете подсказывать компилятору, что вы хотите, чтобы объектные литералы выводились согласно this проблема:
let flies=true;
//types as { readonly animal: "bird" | "fish"; }
const parms ={
animal: flies ? 'bird' : 'fish'
} as const
В версии 3.3 и ниже вы можете использовать функцию, чтобы сообщить компилятору, что вы хотите сделать вывод литерального типа:
let flies=true;
function withLiteralTypes<T extends Record<string, P>, P extends string | number | null | boolean | Record<string, P>> (o: T) {
return o;
}
// types as { animal: "bird" | "fish"; }
const parms =withLiteralTypes({
animal: flies ? 'bird' : 'fish',
})