您可以通过为 prop(传统上为 K)声明扩展 keyof T 的类型来告诉 TypeScript value 的值:
export const findObjectByKey = <T, K extends keyof T>(
prop: K,
value: T[K],
data: ReadonlyArray<T>
) => data.find((x) => x[prop] === value);
现在 TypeScript 知道比较没问题(它适用于类型不是 string 的属性,尽管您现在可能不需要它):
// Works, `obj.foo` is string
findObjectByKey("foo", "x", [{ foo: "y" }])
// Works, `obj[42]` is string
findObjectByKey(42, "x", ["1"])
// Works, `obj.foo` is number
findObjectByKey("foo", 42, [{ foo: 27, bar: "x" }])
// Error as desired, `obj.foo` is number but `value` is string
findObjectByKey("foo", "x", [{ foo: 27, bar: "x" }])
// ^−−−−− Argument of type 'string' is not assignable to parameter of type 'number'.
Playground link
非常感谢Aleksey L. 指出我们可以做得更好,而不仅仅是属性值类型的联合。