如何声明描述某个对象的键和相应值类型的类型


在这种情况下,

如何让编译器检查值的类型?

type SomeType = {
  foo: string[];
  bar: number | null;
};
type SomeTypeChanges<K extends keyof SomeType = keyof SomeType> = {
  key: K;
  value: SomeType[K]
};
declare function baz(changes: SomeTypeChanges);
// must be an error in both cases
baz({key: "foo", value: 1}); // type of value must be string[]
baz({key: "bar", value: ["a", "b"]}) // type of value must be number | null

实际上,情况更加困难我从外部库导出这些东西:

export interface MyEvent<Payload> {
  (payload: Payload): Payload;
}
export declare function createEvent<E = void>(eventName?: string): MyEvent<E>;

并尝试使用是这样的:

const myEvent = createEvent<SomeTypeChanges<keyof SomeType>>();
myEvent({ key: "foo", value: 1 });
                      ^^^^^

所以我无法将类型参数添加到函数中

您需要将类型参数添加到函数中。该函数是导致在调用站点进行推理的工具。仅仅因为类型是泛型并不意味着会发生任何推理,并且由于您有将使用的K的默认值,因此不会出错。

这符合您的预期:

type SomeType = {
  foo: string[];
  bar: number | null;
};
type SomeTypeChanges<K extends keyof SomeType> = {
  key: K;
  value: SomeType[K]
};
declare function baz<K extends keyof SomeType>(changes: SomeTypeChanges<K>);
// must be an error in both cases
baz({key: "foo", value: 1}); // err
baz({key: "bar", value: ["a", "b"]}) // err

最新更新