在这种情况下,如何使编译器检查值的类型?
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 });
^^^^^
所以我不能将类型参数添加到函数中
答案 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