我如何强制 TypeScript 在此代码上给出错误?

How can I enforce TypeScript to give an error on this code?

我通常在 TypeScript 中定义非常复杂的类型,所以我从来没有遇到过这个问题,但我找不到解决它的简单方法。

type first = number;
type second = number;

let f: first = 1;
let s: second = 2;

const func = (arg1: first, arg2: second) => { };

func(s, f);

我希望从这段代码中得到一个错误,因为我用 "first" 类型的第一个参数和 "second" 类型的第二个参数定义了函数,但是当我调用它时,我传递了两个参数倒置类型

TypeScript 不关心类型名称(或别名),只关心类型的形状。 firstsecond 这两种类型对于编译器来说是相同的类型,你不会得到错误。

事实上,由于结构类型,这段代码也可以工作:

interface I1 {
  name: string;
  age: number;
}

interface I2 {
  age: number;
  name: string;
}

var a1: I1;
var a2: I2;

function log(arg1: I1, arg2: I2): void {
  console.log(arg1, arg2);
}

log(a2, a1);

因为,I1I2 也是同一类型的别名(两个接口具有相同类型的相同属性)

目前打字稿不支持nominal typing。 作为解决方法,人们使用类型 tagging/branding:

type First = number & { readonly _tag: unique symbol };
type Second = number & { readonly _tag: unique symbol };

let f = 1 as First;
let s = 2 as Second;

const func = (arg1: First, arg2: Second) => { };
func(s, f);  // Error: Types of property '_tag' are incompatible.