我这些课程:
abstract class BaseExampleService<TModel extends Model, TOmitAttrs extends string = ""> extends BaseApiModelService<
TModel,
TOmitAttrs
> {
abstract add(data: Omit<Payload<TModel>, TOmitAttrs>): OptimisticModelResult<TModel>
}
class ExampleService extends BaseExampleService<Example, "test"> {
add(example): AddModelResult<Example> {
// TODO: Why does `example` have type `Any` instead of `Omit<Example, "test">`?
}
}
尽管
example
中的ExampleService.add
参数显然应该是Omit<Example, "test">
,但它被解释为Any
。
即使实现接口而不是使用继承:
interface BaseService<TPayload> {
add(data: TPayload): void
}
class UserService implements BaseService<User> {
add(data) {
// TODO: `data` implicitly has type `any`
}
}
当然,这与大多数类型语言的工作方式完全不同。通常,您不会因为类型是通用的而丢失类型。
怎么会?
事实证明,这是被提议并关闭的:
https://github.com/Microsoft/TypeScript/issues/1373
https://github.com/microsoft/TypeScript/pull/6118
我猜泛型基类在 TypeScript 中已经被阉割了,并且将继续如此。 :(
编辑:这是值得关注的问题:https://github.com/microsoft/TypeScript/issues/23911