【发布时间】:2019-12-21 11:30:51
【问题描述】:
我已经构建了一个方法,它将一个数组与传入的另一个数组连接起来。该数组位于一个名为 state 的父对象上,该对象通常在我的方法中键入。
我的方法是这样的:
export const mutateConcat = <T, K extends keyof T>(state: T, key: K, val: T[K]) => {
((state[key] as unknown) as any[]) = ((state[key] as unknown) as any[]).concat(val);
}
显然这很难看,我想去掉unknown 和any[] 的演员表。我还希望能够确定数组内容的类型。
基本上,我需要确保 T[K] 是一个数组,理想情况下我想将数组内容的类型分配给另一个泛型参数,例如 U。
我尝试过<T, K extends keyof T, U extends Array<T[K]>>,但它会将U 分配给数组本身的类型,而不是数组内容的类型。
我问的可能吗? extends keyof 是否可以只过滤为数组类型的键,这些数组内容的类型可以分配给另一个类型参数吗?
提前致谢
编辑:
所以,我设法通过关闭val 变量来获取数组的类型。所以如下:
export const mutateConcat = <T, U, K extends keyof T>(state: T, key: K, val: T[K] & U[], arrayDistinctProperty?: keyof U) => {
// U now contains the array type, and `arrayDistinctProperty` is typed to a property on that array type object
((state[key] as unknown) as any[]) = ((state[key] as unknown) as any[]).concat(val);
}
但是,这并不能解决强制转换的丑陋问题,因为 typescript 不能确定 T[K] 是一个数组类型。是否可以告诉它只允许我的key 参数成为T 上的数组类型?
【问题讨论】:
标签: arrays typescript generics typescript-generics