javascript - 如何动态确保对象中的函数仅使用它接受的参数调用?

标签 javascript typescript

考虑以下问题,

interface ITemplateA {
    name: string;
}
const templateA = ({ name }: ITemplateA) => `Hello, I am ${name}`

interface ITemplateB {
    age: number;
}
const templateB = ({ age }: ITemplateB) => `I am, ${age} years old`;

const templates = {
    templateA,
    templateB
}

interface IGenerateText {
    template: keyof typeof templates;
    params: any;
}
const generateText = ({ template, params }: IGenerateText) => templates[template](params);

我如何使用 params: any 重构该部分,以便 typescript 将获取以下内容:

generateText({ template: 'templateA', params: { name: 'michael' } }); // no error
generateText({ template: 'templateA', params: { age: 5 } }); // error
generateText({ template: 'templateB', params: { age: 5 } }); // no error

最佳答案

这似乎可以解决问题。我认为您也可以巧妙地摆脱函数内部的 as any...

const templateA = ({ name }: { name: string }) => `Hello, I am ${name}`;

const templateB = ({ age }: { age: number }) => `I am, ${age} years old`;

const templates = {
  templateA,
  templateB,
};
type TemplateName = keyof typeof templates;

interface IGenerateText<T extends TemplateName> {
  template: T;
  params: Parameters<typeof templates[T]>[0];
}

function generateText<T extends TemplateName>({ template, params }: IGenerateText<T>) {
  return (templates[template] as any)(params);
}

generateText({ template: "templateA", params: { name: "michael" } }); // no error
generateText({ template: "templateA", params: { age: 5 } }); // error
generateText({ template: "templateB", params: { age: 5 } }); // no error

关于javascript - 如何动态确保对象中的函数仅使用它接受的参数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74885689/

相关文章:

javascript - 在数据列表中重复jquery datepicker

Javascript 文件上传只需两步

angular - 是否有用于检测未使用的类属性的 eslint 规则?

typescript - 属性 'prototype' 不存在

javascript - jQuery UI 对话框无法正确居中

javascript - canvas 上的 drawImage 在 firefox 中有奇怪的长宽比和其他问题

javascript - 如何将此脚本的设置保存在 cookie 中并使其依赖于另一个脚本?

html - 如何使用 OnChanges angular 来改变背景颜色?

Angular APP_INITIALIZER

typescript - 角度 6 : Why does HttpClient work even without importing HttpClientModule?