gpt4 book ai didi

typescript - 为什么 Typescript 允许类型切片?

转载 作者:行者123 更新时间:2023-12-04 01:26:46 25 4
gpt4 key购买 nike

有人可以向我解释为什么这会在 Typescript 中编译吗?

class Result<T> {
object: T | null = null;
}

function setOnlyA(res: Result<{ a: number }>) {
res.object = { a: 5 };
}

function setAB(res: Result<{ a: number; b: string }>) {
setOnlyA(res);
// everything compiles fine, but res object is invalid
// at this point according to type definitions
}

我希望 setOnlyA 调用在 setAB 中被禁止。我打开了 strict 模式。我需要一些其他设置吗?

最佳答案

不幸的是,这是 typescript 类型系统的一个基本问题。假定字段是协变的,即使可读和可写字段实际上应该使类型不变。 (如果您想了解协变和逆变,请参阅 answer)。

Ryan Cavanaugh 在 this 中解释道:

This is a fundamental problem with a covariant-by-default type system - the implicit assumption is that writes through supertype aliases are rare, which is true except for the cases where it isn't.

对字段变化非常严格可能会给用户带来很大的痛苦,即使对函数启用严格变化也只是针对函数类型而不是方法,详情 here :

The stricter checking applies to all function types, except those originating in method or construcor declarations. Methods are excluded specifically to ensure generic classes and interfaces (such as Array)

有人提议启用 writeonly 修饰符(并且对 readonly 更严格)或者有显式的协变/反变注解,所以我们可能会在某个时候得到一个严格的标志稍后日期,但此时这是 TS 团队做出的不合理/可用性权衡。

关于typescript - 为什么 Typescript 允许类型切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61775252/

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