【发布时间】:2021-12-28 15:27:24
【问题描述】:
我准备了一个 Angular 服务的简化示例,它带有多个允许通过方法覆盖的通用类型。我在这里面临的问题是= vs extends 并在参数中输入。出于某种原因,= 非常适合返回类型,但参数类型需要 extends。
class Service<
RequestBody,
ResponseBody,
CreateRequestBody = RequestBody,
CreateResponseBody = ResponseBody,
>
{
public createOne<
$CreateRequestBody extends CreateRequestBody,
$CreateResponseBody = CreateResponseBody
>(body : $CreateRequestBody) : $CreateResponseBody
{
return null;
}
public createTwo<
$CreateRequestBody = CreateRequestBody,
$CreateResponseBody = CreateResponseBody
>(body : $CreateRequestBody) : $CreateResponseBody
{
return null;
}
}
以下是反映问题的示例,我想在发现问题后使用createTwo() 方法。此时它不会验证 body 的类型。
const service: Service<{ foo: string }, void> = new Service<{ foo: string }, void>();
// working
service.createOne({
foo: 'test'
});
// not fine as the types are not compatible
service.createOne<void, void>({
bar: 'test'
});
// not fine as everything can be set for body - typing not working for some reason
service.createTwo({
bar: 'test'
});
// fine as the local override works
service.createTwo<{ bar: 'test' }, void>({
bar: 'test'
});
这里是TypeScript Playground,看看编译器做了什么。
【问题讨论】:
-
您的游乐场链接已损坏;你能修好吗?
-
你知道
=是什么吗?这是default,而不是约束。无论如何,我不确定所有泛型类型参数的目的是什么。如果我删除了课堂上除前两个之外的所有内容,我会得到this code,这似乎工作得很好。这是我的建议,除非你可以让 minimal reproducible example 演示一个需要额外类型参数的用例。 -
我修复了操场链接,谢谢
-
另请注意,您的示例代码在
return null处有错误;您可能应该删除或抑制这些错误,以免分散您的问题。如果您不关心实现,您可以写return null!使其成为never。或者你可以做点别的。 -
糟糕,抱歉...改用this。
标签: typescript generics types