【发布时间】:2021-08-28 13:36:56
【问题描述】:
我有以下 TS 代码:
type FunctionMap = Record<
string,
(...params: any) => any
>
function needsARecordOfFunctions(functions: FunctionMap) {
/* ... */
}
needsARecordOfFunctions({ myFunc: 'foobar' }); // Type 'string' is not assignable to type '(...params: any) => any'.
needsARecordOfFunctions(); // Expected 1 arguments, but got 0.
needsARecordOfFunctions({ myFunc: () => {} }); // ✅
// This passes but I want it to fail
needsARecordOfFunctions({});
我的问题是,我怎样才能让needsARecordOfFunctions({}) 因上述代码中的类型错误而失败?我想定义一种记录类型,它至少定义了一条记录。
【问题讨论】:
-
您的问题源于
{}在许多情况下不被视为空对象,而是被视为非常广泛的“任何事情发生”类型。确保参数中不允许空对象是棘手的。首先,您需要让编译器推断出使用泛型类型参数传入的参数的确切类型 -
通常,您可以使用
keyof {}是never的观察结果,但是由于Record实用程序类型带来的索引签名,您的情况很复杂。您首先需要一个用于删除索引的实用程序。见这里:stackoverflow.com/q/51465182/11407695 -
然后您可以检查生成的泛型类型参数的
keyof是否为never,如下所示:tsplay.dev/Wzyb3m。稍后我将起草一份详细解释步骤的答案
标签: typescript