Typescript类型别名和字符串插值

vsikbqxv  于 2023-01-27  发布在  TypeScript
关注(0)|答案(2)|浏览(141)

我使用Typescript已经有一段时间了,目前正在使用具有以下形式的类型别名:

type Animal = "cat" | "dog";
let a1_end = "at";
let a1: Animal = `c${a1_end}`

据我所知,只有值“cat”或“dog”才能被允许用于任何类型为Animal的变量。但严格地说,这应该是可能的,因为结果将是“cat”,对吗?我只是问,因为我得到的错误,任何类型为Animal的变量的唯一允许的值可以是“cat”或“dog”,当我运行这段代码。

cidc1ykv

cidc1ykv1#

问题是a1_end的类型被推断为 string

let a1_end = "at";
//  ^? string

所以这里使用字符串实际上产生了一个不能赋值给"cat"的类型:

let a1: Animal = `c${a1_end}`
//               ~~~~~~~~~~~~ type is `c${string}`

由于c${string}不能赋值给"cat",所以会得到一个错误(因为任何以“c”开头的字符串都不能赋值给字符串“cat”)。
如果您以任何方式注解该类型或告诉TypeScript a1_end的类型是"at",它都可以工作:

let a1_end = "at" as "at";
let a1_end = "at" as const;
let a1_end: "at" = "at";
const a1_end = "at";

Playground

gzszwxb4

gzszwxb42#

因为你把c${string}赋给变量a1,变量a1是动物类型,所以你得到了错误。(因为类型'c${string}'不能赋给类型'Animal'。)我的意思是任何以' c '开头的字符串都不能赋给字符串"cat"
如果您对类型进行注解或者a1_end的类型为"at",那么您的脚本将在TypeScript中工作
解决方案:
1.最简单的方法是用const声明a1_end

const a1_end  = "at"

使用上面的解决方案,您可以轻松地将类型"at"分配给a1_end
如果你想继续用let声明变量,只需按照第二个解决方案
1.将"at"类型分配到a1_end

let a1_end : "at" = "at"

let a1_end  = "at" as "at"

要了解更多关于TypeScript中类型别名的信息,我推荐阅读本文https://www.digitalocean.com/community/tutorials/typescript-type-alias

相关问题