在这种情况下,
如何让编译器检查值的类型?
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