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

时间:2019-06-06 07:15:32

标签: typescript typescript-typings

在这种情况下,如何使编译器检查值的类型?

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 });
                      ^^^^^

所以我不能将类型参数添加到函数中

1 个答案:

答案 0 :(得分:0)

您需要将类型参数添加到函数中。该功能是导致推理在呼叫站点发生的媒介。仅仅因为类型是通用类型,并不意味着将发生任何推断,并且由于将使用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