繁体   English   中英

一种在泛型中禁用“类型参数推断”的方法?

[英]A way to disable “type argument inference” in generics?

我希望为泛型提供默认值将优先于类型推断,但它不会:

// placeholder for a real express response.send
const sendResponse =  (x) => console.log(x);

function sendResult<T = never>(send: any, result: T) {
  send(result);
}

// I want to use this always with a type
type Num = { x: number };
sendResult<Num>(sendResponse, { x: 1 });
sendResult<Num>(sendResponse, { x: 'sss' }); // correctly showing error

// When I don't supply type, I'd like an error.
// But, T gets inferred instead of defaulting to never... so, no error :-(
sendResult(sendResponse, {x: 1})

见演示

如果没有提供通用,有没有办法确保抛出错误?

打字稿版本:3.5.2

我不理解用例,因为禁用TypeScript用户期望的行为可能会引起混淆。 但你是老板。

现有的GitHub建议允许开发人员指出不应使用泛型类型参数的特定用法进行推理。 对此没有官方支持,但我认为我们可以在查看依赖于未解析的泛型类型参数的条件类型时利用编译器的行为来模拟它:

type NoInfer<T> = [T][T extends any ? 0 : never];

这本质上是T上的无操作,因为你插入的任何值(比如string )都会出现在另一边: [string][string extends any ? 0 : never] [string][string extends any ? 0 : never]变为[string][0]变为string 但是编译器看到T extends any并且决定推迟计算直到T得到解决。 特别是,它不能使用该值来推断T

那么我们可以试试

function sendResult<T = never>(send: any, result: NoInfer<T>) {
  send(result);
}

并了解它的行为:

type Num = { x: number };
sendResult<Num>(sendResponse, { x: 1 }); // okay
sendResult<Num>(sendResponse, { x: "sss" }); // error

sendResult(sendResponse, { x: 1 }); // error

前两种情况可以正常工作,因为指定Num会给出T一个确定的值,而NoInfer<Num>只是Num 在最后一种情况,编译器真的有没有可行的推断网站T ,因此它必须回落到默认never ,你会得到你想要的错误。

链接到代码

这样你可以按照自己的意愿工作,但请记住,你可能想重新考虑这个想法,因为得到这个错误的人可能会对他们应该做些什么来搞错,以免错误消失。 人们依赖于类型推断,所以如果你继续这样做,你需要一些很棒的文档。

无论如何,希望有所帮助; 祝好运!

暂无
暂无

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

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