gpt4 book ai didi

Typescript通用接口(interface)参数赋值

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:58 24 4
gpt4 key购买 nike

我很难理解为什么 typescript 编译器认为这个例子无效:

interface IExample<T> {
param: T
}

function testFunc<U, I extends IExample<U>>(myParam: U): I {
return { param: myParam };
}

产生的错误是:

Type 'U' is not assignable to type 'I["param"]'.

我(假设是不正确的)阅读这段代码是:

  • IExample<T>期待 param有类型 T .
  • IIExample<U> 的子类型, 意思是 param类型为 U .
  • myParam类型为 U来自参数注释。
  • 因此myParam应该是 param 的有效值的 I .

<I>作为返回值的前缀清除了错误,那么为什么错误首先出现呢?

最佳答案

问题是 I除了 param 之外,可能还有其他必需的属性. Typescript 将强制您的通用函数实现为任何 I 返回有效值满足扩展 IExample<U> 的约束,但事实并非如此。

例如:

interface DerivedIExample extends IExample<number> {
other : string
}
let o = testFunc<number, DerivedIExample>(0)
o.other // required by the DerivedIExample but not assigned

在您的简单示例中,最好取消 I完全:

function testFunc<U>(myParam: U): IExample<U> {
return { param: myParam };
}

您可以使用类型断言强制编译器接受您的代码,但如上所述这不是类型安全的:

function testFunc<U, I extends IExample<U>>(myParam: U): I {
return { param: myParam } as I; // NOT TYPE SAFE! USE WITH CARE !
}

关于Typescript通用接口(interface)参数赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53267269/

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