【发布时间】:2019-07-30 12:00:49
【问题描述】:
我正在尝试编写一个带有回调的函数,其参数类型取决于非回调函数的参数参数。
我尝试使用typeof 推断类型,该类型可以正确缩小分支中的新声明,但不会缩小回调范围。
type Argument = "Foo" | "Bar";
type CallbackArgument<T extends Argument> = T extends "Foo" ? "One" : T extends "Bar" ? "Two" : never;
function foo(arg: Argument, callback: (callbackArg: CallbackArgument<typeof arg>) => void) {
if (arg === "Foo") {
callback("Two") // Works, callbackArg hasn't narrowed.
const two: CallbackArgument<typeof arg> = "Two" // Error, narrowing seems to work.
}
}
由于typeof arg 已明显缩小到"Foo",我希望callbackArg 在分支内正确缩小到"One",就像它对新声明(如two)所做的那样。
我正在使用 Typescript 3.5.2。
【问题讨论】:
-
@GOTO0 “它确实缩小了”是什么意思?
callback接受One或Two作为参数,这是 OP 想要阻止的。他们希望根据检查arg === "Foo"将callback缩小为仅接受One -
@GOTO0 不是真的,你在
callback("Two")调用和callback("One")上都会收到错误。因此,如果没有类型断言,您将无法使用任何东西调用它。我猜这过于简化了,所以不确定这是否有助于实际用例 -
@GOTO0 我应该写到您提出的解决方案是我最初的尝试。正如 Titian 所提到的,这根本不会缩小类型,并使所有对
callback的调用无效。 -
@HenrikAndersson 是的,这是真的。现在要删除我的 cmets。
标签: typescript typeof narrowing conditional-types type-narrowing