You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:27:08