машинопись выводить строковый литерал из троичного условного - PullRequest
0 голосов
/ 01 февраля 2019

Это упрощенный пример:

function doSomething(animal: 'bird' | 'fish'){ }

let flies=true;

const animal = flies ? 'bird' : 'fish'

doSomething(animal);         

Typescropt выводит тип 'bird' |«Рыба» в отведении к животному из тройной условно.(если бы животное не было константным, оно бы жаловалось, так как оно выводило бы строку типа, которую нельзя присвоить 'bird' | 'fish') *

Но

const parms ={
    animal: flies ? 'bird' : 'fish'
}
doSomething(parms);  /* Argument of type '{ animal: string; }' is not    
                        assignable to parameter of type '{ animal: "bird" | "fish"; } */

Здесь это выводящая строка изтройной условный.Есть ли способ сохранить вещи в этом стиле (т. Е. Не нужно определять тип и объявлять field animal этим типом)

1 Ответ

0 голосов
/ 01 февраля 2019

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',
})
...