Typescript条件映射类型会丢失返回类型信息

时间:2019-06-10 19:37:56

标签: typescript conditional-types mapped-types

我正在尝试将条件映射类型放在首位。如果我将类型定义为:

type StringyProps<T> = { [K in keyof T]: T[K] extends string ? K : never }[keyof T];

[keyof T]构造到底在做什么?如何找到有关该怎么做的文档?

我还编写了一个函数:

function getString<T>(thing: T, prop: StringyProps<T>): string {
  return thing[prop] as string;
}

如果我的界面如下:

interface Something {
  name: string,
  id: string,
  age: number,
  weight: number
}

我收到以下编译时错误:

console.log(getString(pippy, "name")); // ok
console.log(getString(pippy, "age")); // age is not assignable to parameter of type "name" | "id"

这太棒了,但是我的函数无法编译,因为将StringyProp的值分配给字符串可能是错误的。如果我将返回值更改为return thing[prop] as unknown as string,它将返回正确的值。

如何构造它,这样我就不必断言未知的字符串并重新断言?

1 个答案:

答案 0 :(得分:1)

Typescript不能遵循StringyProps<T>仅代表string私钥的事实。最好的解决方案是使用类型断言:

function getString<T>(thing: T, prop: StringyProps<T>): string {
  return thing[prop] as unknown as string;
}

您也可以稍作更改,但是intelisense将不再建议按键,因此我真的不认为这是值得的,致电现场体验更为重要:

function getString<K extends PropertyKey>(thing: Record<K, string>, prop: K): string {
  return thing[prop]; // ok no assertion
}

console.log(getString(pippy, "name")); // ok
console.log(getString(pippy, "age")); //err