如何仅指定函数的返回类型而不指定参数?

时间:2019-11-29 03:04:42

标签: typescript generics typescript-typings typescript-generics

这样的代码:

const t = {
    k1: null,
    k2: null,
}
const a = {
    k1: () => null,
    k2: (arg1: number) => null,
}
a.k1()
a.k2()

现在我希望对象“ a”将由对象“ t”中的键控制,我想要在我将k3,k4写到“ a”时不存在该键,并将其写到“ a”时,应该有一个错误

所以我尝试这种方式

const t = {
    k1: null,
    k2: null,
}
const a: Record<keyof typeof t, (...args: any[]) => void> = {
    k1: () => null,
    k2: (arg1: number) => null,
}
a.k1()
a.k2()

但是当我调用a.k2时,没有关于args的提示,即使我没有输入参数也没有来自编译器的错误。

所以,我在脑海中写下了什么:

const t = {
    k1: null,
    k2: null,
}
const a: Record<keyof typeof t, (...args: Parameters<typeof a[keyof typeof t]>) => null> = {
    k1: () => null,
    k2: (arg1: number) => null,
}
a.k1()
a.k2()

但是,编译器出现错误:

  

'args'在其自己的类型注释中直接或间接引用。

Playground

我最后想要的是:

const t = {
    k1: null,
    k2: null,
}
const a: ????? = {
    k1: () => null,
    k2: (arg1: number) => null,
    k3: ()=>null, // should have an error like, 'k3' does not exist in keyof typeof t
}
a.k1()
a.k2()  // should have an error like, An argument for 'arg1' was not provided.

我不知道输入“ ?????”应该替换为什么。

“键控和&参数技巧”这两个都可以做什么?还是只为函数指定返回类型,而不指定参数?

1 个答案:

答案 0 :(得分:0)

您不能在类型注释中指定变量的类型,而让编译器从初始化表达式中推断出该变量的详细信息。

您可以做的是使用一个函数。一个函数可以在根据约束检查那些参数的同时从参数推断:

const t = { k1: null, k2: null }

function asFunctions<T>() {
    return function <U extends Record<keyof T, (...args: any[]) => void>>(o: U) {
        return o
    }
}
const a = asFunctions<typeof t>()({
    k1: () => null,
    k2: (arg1: number) => null,
});
a.k1()
a.k2() // err now

Playground Link