繁体   English   中英

Typescript 通用接口参数赋值

[英]Typescript generic interface parameter assignment

我正在努力理解为什么这个例子不被打字稿编译器认为是有效的:

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应该是I param的有效值。

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

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

例如:

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 !
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM