gpt4 book ai didi

typescript - TypeScript 中泛型类型不匹配时不会出错

转载 作者:行者123 更新时间:2023-12-04 15:56:22 25 4
gpt4 key购买 nike

我想知道为什么我可以在 configure() 中提供不同的通用接口(interface)方法比我的class ?在第一个 no error例如,我提供 IType<Args1>作为 MyClass 的泛型类型然后我可以简单地用 IArgs2 覆盖它缺少一个 Prop ,我没有收到任何错误。有什么方法可以确保类型完全相同?

interface IArgs1 {
a: string;
b: string;
}

interface IArgs2 {
a: string;
}

interface IArgs3 {
d: string;
}

interface IType<T> {
configure(args: T): void
}

// no error - even if 'b' is missing from IArgs2
class Class implements IType<IArgs1> {
configure(args: IArgs2) {}
}

// error - because it's missing all IArgs1 attributes
class MyClass implements IType<IArgs1> {
configure(args: IArgs3) {}
}

最佳答案

这是因为 T处于逆变位置。考虑这个例子:

interface IArgs1 {
a: string;
b: string;
}

interface IArgs2 {
a: string;
}

type Covariance<T> = { box: T };

declare let args1: Covariance<IArgs1>;
declare let args2: Covariance<IArgs2>;

args1 = args2 // error
args2 = args1 // ok

您可能已经注意到 args2不能分配给 args1 .这是相反的行为。

考虑这个例子:

type Contravariance<T> = { box: (value: T) => void };

declare let args1: Contravariance<IArgs1>;
declare let args2: Contravariance<IArgs2>;

args1 = args2 // ok
args2 = args1 // error

现在,继承箭头发生了相反的变化。 args1不再可分配给 args2args2可分配给 args1 .

与您的行为相同:

interface IType<T> {
configure(args: T): void
}

自从 IType<T>Contravariance 相同在方差上下文中。

这就是这里没有错误的原因:

// no error - even if 'b' is missing from IArgs2
class Class implements IType<IArgs1> {
configure(args: IArgs2) { }
}

因为 IArgs1延长 IArgs2

这里有一个错误:

// error - because it's missing all IArgs1 attributes
class MyClass implements IType<IArgs1> {
configure(args: IArgs3) {}
}

因为 IArgs1IArgs3是完全不同的类型,没有任何关系。

Here您可以找到有关 *-variance 主题的更多信息

关于typescript - TypeScript 中泛型类型不匹配时不会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69883765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com