1

我正在尝试编写一个带有回调的函数,其参数类型取决于非回调函数的参数参数。

我尝试推断使用typeofwhich 为分支中的新声明正确缩小但不缩小回调的类型。

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。

4

1 回答 1

2

缩小适用于单个变量。Typescript 没有可以一起缩小的相关变量/参数的概念。

你唯一能做的就是使用一个可区分的元组作为参数,缩小元组并从中传播参数:

type Argument = "Foo" | "Bar";
type CallbackArgument<T extends Argument> = T extends "Foo" ? "One" : T extends "Bar" ? "Two" : never;

function foo(args: ["Foo", (p: "One") => void] |  ["Bar", (p: "Two") => void]) {
    if (args[0] === "Foo") {
        const [arg, callback] = args;
        callback("Two") // Error now
        const two: CallbackArgument<typeof arg> = "Two" // Error
    }
}

于 2019-07-30T12:17:27.733 回答