【发布时间】:2021-12-05 08:53:56
【问题描述】:
我正在尝试:
- 所有字段名称的列表
- 无法排序的字段名称列表
我试图推断 ugh 是否是 unsortable 的补码。
function isUnsortableField<All extends string | number | symbol, T extends All, K extends Exclude<All, T>>(unsortable: Array<K>, field: All): field is T {
return !!unsortable.find((f) => f === field)
}
const allFields = ['bar', 'zee'] as const;
const unsortableOnes: Array<typeof allFields[number]> = ['bar'];
const ugh = isUnsortableField(unsortableOnes, 'bar');
但是我得到:
Argument of type '("bar" | "zee")[]' is not assignable to parameter of type 'never[]'.
Type 'string' is not assignable to type 'never'.
Type 'string' is not assignable to type 'never'.ts(2345)
编辑:1000 只橡皮鸭之后,修复:
是:unsortable: Array<K>,但应该是 unsortable: Array<T>
function isSortableField<
All extends PropertyKey,
Unsorted extends All,
K extends Exclude<All, Unsorted>
>(unsortable: Array<Unsorted>, field: All): field is K {
return !unsortable.find((f) => f === field);
}
【问题讨论】:
-
unsortable是什么意思? -
这只是一个用例。我有一个集合 A 和一个名为 B 的 A 子集(字段与不可排序的字段)。我想断言元素是否在 A 和 !B
-
不是 100% 确定您要解决什么问题。如果您只是想以打字稿安全/运行时的方式确保数组中的某些内容,则执行
unsortableOnes.includes('bar')可以。 IOW:如果你这样做了unsortableOnes.includes('xyz')typescript 会抱怨。 -
在函数的第三个通用参数中,您将排除所有扩展所有的东西,这将始终解析为
never
标签: typescript types type-conversion typeerror