我如何强制 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 不关心类型名称(或别名),只关心类型的形状。 first
和 second
这两种类型对于编译器来说是相同的类型,你不会得到错误。
事实上,由于结构类型,这段代码也可以工作:
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);
因为,I1
和 I2
也是同一类型的别名(两个接口具有相同类型的相同属性)
目前打字稿不支持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.
我通常在 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 不关心类型名称(或别名),只关心类型的形状。 first
和 second
这两种类型对于编译器来说是相同的类型,你不会得到错误。
事实上,由于结构类型,这段代码也可以工作:
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);
因为,I1
和 I2
也是同一类型的别名(两个接口具有相同类型的相同属性)
目前打字稿不支持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.