参数具有 Any 类型,即使它是通用基类中的强类型(TypeScript bug?)

问题描述 投票:0回答:1

我这些课程:

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

当然,这与大多数类型语言的工作方式完全不同。通常,您不会因为类型是通用的而丢失类型。

怎么会?

typescript typescript-generics
1个回答
0
投票

事实证明,这是被提议并关闭的:

https://github.com/Microsoft/TypeScript/issues/1373

https://github.com/microsoft/TypeScript/pull/6118

我猜泛型基类在 TypeScript 中已经被阉割了,并且将继续如此。 :(

编辑:这是值得关注的问题:https://github.com/microsoft/TypeScript/issues/23911

© www.soinside.com 2019 - 2024. All rights reserved.