关键字';类型';在Javascript和Typescript中?

关键字';类型';在Javascript和Typescript中?,typescript,typescript-typings,Typescript,Typescript Typings,假设我有这个例子 const Bob = 'Bobby'; interface IName { text: typeof Bob; } let newName: IName = { text: 'Bobby' } 当我初始化变量“newName”时,如果我试图将文本“Bobby”更改为其他内容,它会给我一个错误,但新文本仍然是字符串类型 如果我做了console.log(typeof Bob)它打印“string”,那么在界面中键“text”应该是“string”类型,对吗

假设我有这个例子

const Bob = 'Bobby';

interface IName {
    text: typeof Bob;
}

let newName: IName = {
    text: 'Bobby'
}
当我初始化变量“newName”时,如果我试图将文本“Bobby”更改为其他内容,它会给我一个错误,但新文本仍然是字符串类型

如果我做了
console.log(typeof Bob)
它打印“string”,那么在界面中键“text”应该是“string”类型,对吗


那么为什么typescript在设置“newName”中“text”的值时将我的选项限制为仅文本“Bobby”?

因为
Bob
const
,typescript知道它将始终具有值
'Bobby'
,所以它将类型从
字符串
细化为仅
'Bobby'
。然后,它通过接口传播到您的
newName
实例。如果您有一个支持TS的编辑器,您可以将鼠标悬停在IName.text上,查看:

(property) IName.text: "Bobby"

JS对类型注释一无所知,因此您得到的运行时类型仍然是
string

,值得澄清的是有两个
typeof
操作符。一个是根据JS给出变量基本类型的,另一个是TS的
typeof
,它仅作为类型系统的一部分存在,用于查询它并生成更多的动态类型。@VLAZ:True,如果
typeof
是类型批注的一部分。我认为在常规代码中应该是相同的。是的,在运行时只有一种
typeof
。TS的作用稍微有点过重,但它只是对其已有功能的一个轻微增强。与类型系统的交互是相当小的,因为它只对极少数非常狭窄的对象(原语和对象/函数)进行类型缩小。TypeScript中的
typeof
是一个完全不同的运算符。IMO的名称应该有所不同,但我认为这可能会导致更多的混乱。