typescript 泛型约束问题

场景描述

通过 keysmap参数,运算出list

const keys = ['a', 'b'];
const map = {
    a: 1,
    b: 2,
    c: 3,
};

const list = getListFromMap(keys, map);

//list结果应为:
// [1, 2]

相关代码

interface IMap<T> {
  [props: string]: T;
}
export function getListFromMap<T>(keys: string[], map: IMap<T>) {
  let resault: T[] = [];
  if (!keys || !keys.length) {
    return resault;
  }
  for (const key of keys) {
    if (map[key]) {
      resault.push(map[key])
    }
  }
  return resault;
}

问题描述

关于typescript方面,目前存在的问题是:
getListFromMap函数的参数keys得类型跟参数map的类型没有形成约束关系。

期望效果

keys数组里每一个值都一定得是mapkey值,用泛型约束或其他方法,可以通过TS静态检查出来。

阅读 3.9k
2 个回答
function getListFromMap<T, K extends keyof T>(map: T, keys: K[]): (T[K])[] {
  return keys.map(key => map[key])
}

const map = {
  a: 1,
  b: '2',
  c: 3,
};
const keys: (keyof typeof map)[] = ['a', 'b'];
const list = getListFromMap(map, keys);
interface IMap<T> {
  [props: string]: T
}
export function getListFromMap<T, K extends string[] = string[]>(
  keys: Partial<K>,
  map: IMap<T>
) {
  let resault: T[] = []
  if (!keys || !keys.length) {
    return resault
  }
  for (const key of keys) {
    if (map[key]) {
      resault.push(map[key])
    }
  }
  return resault
}

getListFromMap<any, ['a', 'b']>(['a'], {})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题