是否可以将一个参数的类型用于另一个参数?

时间:2018-01-11 19:33:21

标签: typescript

我们说我有一个将更新分派给商店的功能:

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');

1 个答案:

答案 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'.

希望有所帮助;祝你好运!