我一直在尝试制作一个通用函数,它接收对象 T 并接收该对象 T 的字符串属性名称。
我以https://www.typescriptlang.org/docs/handbook/advanced-types.html为例(部分:分布式条件类型)
我想出了一个没有泛型的解决方案,但是当我将显式类型更改为泛型类型时,打字稿将无法编译。
这是非通用版本:
export type TypedPropertyNames<T, P> = { [K in keyof T]: T[K] extends P ? K : never }[keyof T];
export type StringPropertyNames<T> = TypedPropertyNames<T, string>;
interface Test {
test: string;
}
function non_generic(form: Test, field: StringPropertyNames<Test>): string {
return form[field];
}
这行得通。
现在,当我将 Test 接口更改为通用参数时,它将不再编译。
export type TypedPropertyNames<T, P> = { [K in keyof T]: T[K] extends P ? K : never }[keyof T];
export type StringPropertyNames<T> = TypedPropertyNames<T, string>;
function generic<T>(form: T, field: StringPropertyNames<T>): string {
return form[field]; // This won't compile
}
这是预期的行为吗?或者这是一个打字稿错误?谁能指出我使通用版本工作的方向(没有任何黑客)
更新1:
编译错误:
Type 'T[{ [K in keyof T]: T[K] extends string ? K : never; }[keyof T]]' is not assignable to type 'string'.