【发布时间】:2021-07-30 13:10:25
【问题描述】:
我不明白通用约束和普通参数类型之间的区别。 在第一种情况下,我明白我不能调用 si.g(),因为我严格地将 si 键入为 SomeInterface 类型。但是,在第二个示例中 S 扩展 SomeInterface 并且根据我的解释,扩展意味着它需要具有 f() 但可以包含更多属性。但错误是一样的。为什么?
interface SomeInterface {
f();
}
function test1(si: SomeInterface) {
si.f()
// si.g() -> Property 'g' does not exist on type 'SomeInterface'
}
function test2<S extends SomeInterface>(si: S) {
si.f()
// si.g() -> Property 'g' does not exist on type 'SomeInterface'
}
【问题讨论】:
-
S extends SomeInterface表示S可以是SomeInterface的子类型,但不能保证子类型将具有g()。可能是interface OtherInterface extends SomeInterface { e(); } -
S可以是函数的 调用者 想要的SomeInterface的任何子类型。因此,函数的实现者需要编写适用于S的所有可能规范的代码,包括SomeInterface本身,它没有g()方法。 -
@VLAZ 是的,即使在从 SomeInterface 扩展的接口中,也不能保证。这就是函数 test2 中的情况,TS 确保找到 g() 并引发错误,就像 TS 在 test1 中所做的那样。但是除了语法之外,test1 和 test2 有什么区别呢?
-
@user3601578 在这种情况下 - 什么都没有。示例代码对于泛型来说太简单了。
标签: typescript generics parameters