Typescript从三元条件推断字符串文字

时间:2019-02-01 12:27:04

标签: typescript type-inference conditional-operator

这是一个简化的示例:

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

let flies=true;

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

doSomething(animal);         

Typescropt推断类型为“鸟” |从三元条件到动物的“鱼”。 (如果动物不是const,则会抱怨,因为它将推断出类型字符串无法分配给“ 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"; } */

这里是从三元条件推断字符串。有没有办法让事物保持这种风格(即不必定义类型并将场动物声明为该类型)

1 个答案:

答案 0 :(得分:2)

Typescript仅在某些情况下推断字符串文字类型。除非有额外的情况提示该属性的文字类型,否则属性不是其中一种情况。 (与三元运算符无关)。

在打字稿3.4(在写入时未发行的,但已经可以为typescript@nextnpm),你将能够与要推断为每个对象文字暗示编译{{3} }问题:

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