Javascript Typescript动态类型声明

Javascript Typescript动态类型声明,javascript,typescript,typescript-typings,typescript-generics,Javascript,Typescript,Typescript Typings,Typescript Generics,我正在尝试修复这些错误,但不知道如何去做。如果你是TS方面的专家,请帮助我 const a={ a:‘值1’, b:‘值2’, c:{ k:‘值3’ } }; 类型ObjType=a的类型; 函数数组< K扩展对象类型的键=对象类型的键, D扩展对象类型[K]=对象类型[K] >(arg:[K,keyof D]){ const oneLvl=a[arg[0]]; //问题1 //类型“keyof D”不能用于索引类型“{a:string;b:string;c:{k:string;};}[k]”

我正在尝试修复这些错误,但不知道如何去做。如果你是TS方面的专家,请帮助我

const a={
a:‘值1’,
b:‘值2’,
c:{
k:‘值3’
}
};
类型ObjType=a的类型;
函数数组<
K扩展对象类型的键=对象类型的键,
D扩展对象类型[K]=对象类型[K]
>(arg:[K,keyof D]){
const oneLvl=a[arg[0]];
//问题1
//类型“keyof D”不能用于索引类型“{a:string;b:string;c:{k:string;};}[k]”。
const secondLvl=oneLvl[arg[1]];
console.log(secondLvl);
}
funArray(['c','k']);
//工作如期进行
funArray(['c','k']);
//问题2
//类型“k”不可分配给类型“number”|“toString”|“charAt”|“charCodeAt”|“concat”|“indexOf”|“lastIndexOf”|“localeCompare”|“match”|“replace”|“search”|“slice”|“split”|“substring”|“toLowerCase”|。。。还有27个…|"padEnd"。
funArray(['a','k']);

只要去掉第二个泛型:

const a={
a:‘值1’,
b:‘值2’,
c:{
k:‘值3’
}
};
类型ObjType=a的类型;
函数数组<
K扩展对象类型的键,
>(参数:[K,对象类型[K]]的键){
常数fst=arg[0];
常数scd=arg[1]
const oneLvl=a[fst];
const secondLvl=oneLvl[scd];
console.log(secondLvl);
}
funArray(['c','k']);
//工作如期进行
funArray(['c','k']);
//应出现此错误,因为'k'可以用作['a'的键
funArray(['a','k']);
第三个例子没有问题。这是预期的错误


大家好,欢迎来到StackOverflow!参观,坐下来看看。请查收:
  const a = {
  a: 'value 1',
  b: 'value 2',
  c: {
    k: 'value 3'
  }
};

type ObjType = typeof a;

function funArray<
  K extends keyof ObjType = keyof ObjType, 
  D extends ObjType[K] = ObjType[K]
>(arg: [K, keyof D]) {
  const oneLvl = a[arg[0]];

  // Issue # 1
  // Type 'keyof D' cannot be used to index type '{ a: string; b: string; c: { k: string; }; }[K]'.
  const secondLvl = oneLvl[arg[1]];
  console.log(secondLvl);
}
funArray(['c', 'k']);

// Works as expected
funArray(['c', 'k']);

// Issue # 2
// Type '"k"' is not assignable to type 'number | "toString" | "charAt" | "charCodeAt" | "concat" | "indexOf" | "lastIndexOf" | "localeCompare" | "match" | "replace" | "search" | "slice" | "split" | "substring" | "toLowerCase" | ... 27 more ... | "padEnd"'.
funArray(['a', 'k']);