我们说我有一个将更新分派给商店的功能:
updateData<T>(entity: T, prop: keyof T, value: any): void {
const action: Action = new SaveAction(entity, {[prop]: value});
store.dispatch(action);
}
在示例中,我们假设T
是一个代表问题的类,如下所示:
class Question {
readonly content: string;
readonly answer: string;
readonly score: number;
constructor(obj: Stringified<Question>) {
this.content = obj.content;
this.answer = obj.answer;
this.score = obj.score;
}
}
通过确保value
参数只接受具有与属性对应的类型的值,是否可以使此函数更加类型安全?
使用上面的例子,我喜欢TSLint或者Typescript编译器,以免我做类似的事情
updateData<Question>(someQuestion, 'score', 'some string');
答案 0 :(得分:1)
我认为您正在寻找的是:
updateData<T, K extends keyof T>(entity: T, prop: K, value: T[K]): void {
const action: Action = new SaveAction(entity, {[prop]: value});
store.dispatch(action);
}
value
参数使用lookup type将其约束为该键的相关属性类型。您只需在不明确指定类型参数的情况下调用它(不要使用<Question>
):
updateData(someQuestion, 'score', 123); // okay
updateData(someQuestion, 'score', 'some string'); // error:
// Argument of type '"some string"' is not assignable to parameter of type 'number'.
希望有所帮助;祝你好运!