我正在尝试将条件映射类型放在首位。如果我将类型定义为:
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
,它将返回正确的值。
如何构造它,这样我就不必断言未知的字符串并重新断言?
答案 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