为何TypeScript未阻止参数顺序错误传递?代码示例解析
为什么参数顺序错误时TypeScript未抛出编译错误?
这是因为TypeScript采用结构类型系统(俗称鸭子类型)——它判断类型兼容性的依据是类型的实际结构,而不是类型的名称。
你的FirstName和LastName类结构完全一致:两者都包含一个公开的string类型属性value,构造函数的参数也都是string类型。在TypeScript的类型检查逻辑里,这两个类的实例具有完全相同的结构,因此它们的类型是互相兼容的。
所以当你把LastName实例传给期望FirstName的参数,或者反过来时,TypeScript不会认为这是类型错误,自然不会抛出编译提示。
如果需要让这两个类型强制不兼容,可以通过品牌类型给它们添加唯一的私有标识,示例代码如下:
class FirstName { private readonly _brand: 'FirstName' = 'FirstName'; constructor(public value: string) {} } class LastName { private readonly _brand: 'LastName' = 'LastName'; constructor(public value: string) {} } function getFullName(fname: FirstName, sname: LastName){ return `${fname.value} ${sname.value}`; } const fName = new FirstName("Dave"); const lName = new LastName("Cook"); var greeting = getFullName(lName, fName); // 此时会抛出编译错误
私有_brand属性让两个类的结构产生了唯一差异,TypeScript就会将它们视为完全不同的类型,参数顺序错误时就能触发编译检查。
内容的提问来源于stack exchange,提问作者Dave Cook
相关产品推荐
相关产品推荐

