打字稿动态类型声明

时间:2021-04-09 14:43:02

标签: javascript typescript typescript-typings typescript-generics

我正在尝试修复这些错误,但不知道该怎么做。如果您是 TS 方面的专家,请帮助我。 Algowiki

https://www.typescriptlang.org/play?#code/MYewdgzgLgBAhjAvDA3gWAFA3gLhgcgDc4AbAVwFMYBGfAGk2wCM8jTKYAmexmYPdFmwwA1q2LkqAZny8AvpjkBuTJigBPAA5UA8kwBWAFS1VkG7SABm8FRkyWyYYFACW4GA7ABBAE4+46gA8vADSMBQAHlAUYAAmEKIU6lYwekYmSInJ1mnG2nQwvAAi4VEx8akGeRQA2iEAupm5JnX1mAB8ABRwPgDmeHUFIkkpRfUAlKi8oJCw4BQAMoQkmXA1Pb01AAz19ba8APQHMACSEBAcAMQ00+DQMBAUM7FLK8jzr+t9NdS7ttgzCAgEgUAB0JBAvU6j2er3GtgUGE8vn86k6NXwwHoBBE+Am+wwRxgAHUQD4RAk4AlItpnBRYvZHCiAujMdj8Lj8apCcczhcqNdOIzvH4WRi4OzOfDMEA

  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']);

1 个答案:

答案 0 :(得分:0)

去掉第二个泛型:

const a = {
  a: 'value 1',
  b: 'value 2',
  c: {
    k: 'value 3'
  }
};

type ObjType = typeof a;

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


  const secondLvl = oneLvl[scd];
  console.log(secondLvl);
}

funArray(['c', 'k']);

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

// This error is expected, because `k` can be used as a key to a['a']
funArray(['a', 'k']);

第三个例子没有问题。预计会出现此错误

Playground