typescript相交类型中的延迟赋值和惰性类型检查

typescript相交类型中的延迟赋值和惰性类型检查,typescript,Typescript,最近我看到这样的代码(为了有某种名称空间): 有趣的一点是,如果我们删除first.f1=f1行,typescript编译器将为f1变量提供一个错误,并显示 类型“()=>string”不能分配给类型“(()=>string)&{f1:()=>number;}” 类型检查似乎分两步进行,这是一种懒惰的类型检查! 我的问题是这怎么可能 当我们不能使用基于对象的类型时,更有趣的是。例如,在下面的代码中,it类型检查系统按预期引发错误 const second: { n1: number } &

最近我看到这样的代码(为了有某种名称空间):

有趣的一点是,如果我们删除
first.f1=f1
行,typescript编译器将为
f1
变量提供一个错误,并显示

类型“()=>string”不能分配给类型“(()=>string)&{f1:()=>number;}”

类型检查似乎分两步进行,这是一种懒惰的类型检查! 我的问题是这怎么可能

当我们不能使用基于
对象的类型时,更有趣的是。例如,在下面的代码中,it类型检查系统按预期引发错误

const second: { n1: number } & { n2: number } = { n1: 10 };
second.n2 = 8;

有人能详细说明这种行为的原因吗?(您也可以在这里看到并运行上面的代码:)

TypeScript非常实用(),因为事情不一定要有一致的意义,但似乎是在它们有用的基础上添加的。在一个表达式中定义一个带有属性的函数有点棘手(尽管可以这样做),在早期版本的TypeScript中,您编写的内容会受到投诉。函数只是一个特例,请参阅以获取注释。这是否回答了您的问题@问题不在于“let”和“const”之间的区别,而在于如何进行惰性类型检查。TypeScript非常实用(),因为事情不一定要有一致的意义,而是在它们有用的基础上添加了一些东西。在一个表达式中定义一个带有属性的函数有点棘手(尽管可以这样做),在早期版本的TypeScript中,您编写的内容会受到投诉。函数只是一个特例,请参阅以获取注释。这是否回答了您的问题@问题不在于“let”和“const”之间的区别,而在于如何进行惰性类型检查。
const second: { n1: number } & { n2: number } = { n1: 10 };
second.n2 = 8;