typescript - 从 NPM 模块中向界面添加属性

标签 typescript types

我有一个函数可以提供像这样的基本功能:

// File 1: Core function
export const extensions = [];
export interface ResultInterface {
     fullname:string,
     age:number
}

function maFunction():ResultInterface {
    var o = {
         fullname:"alex",
         age:21
    };
    extensions.forEach((extension) => o = extension(o));
    return o;
}

正如您从上面的代码中看到的那样,maFunction 可以通过查看 extensions 数组并应用这些函数来扩展。

例如,可以通过NPM安装以下扩展:

// File 2: Extensions 1 (installed via NPM)
extensions.push(function (o) {
    o.ageInMonths = o.age * 12;
    return o;
});


// File 3: Extensions 2 (installed via NPM)
extensions.push(function (o) {
    o.firstname = o.fullname.split(" ")[0];
    o.lastname = o.fullname.split(" ")[1];
});

现在在用户区:

// File 4: Userland execution
var myVar = maFunction();

myVar.ageInMonths // error: Property 'ageInMonths' does not exist on type 'ResultInterface'.
myVar.firstname // error: Property 'firstname' does not exist on type 'ResultInterface'.
myVar.lastname // error: Property 'lastname' does not exist on type 'ResultInterface'.

我没想到 typeScript 会智能到可以检测通过扩展添加的属性。但是每个扩展如何手动添加它们呢?每个扩展如何扩展 ResultInterface 并添加它自己的属性?

最佳答案

我认为如果不修改 ResultInterface 的 .d.ts 是不可能做到这一点的(参见此处的回复:Extend interface defined in .d.ts file)

你可以做的是使用 Intersection types键入 myVar 并使用您需要的功能扩充它的接口(interface):

var myVar: ResultInterface & {ageInMonths: number, firstname: string, lastname: string} = maFunction();

您可以像这样添加“类型快捷方式”:

type ResultInterfaceAugmented = {ageInMonths: number, firstname: string, lastname: string}& ResultInterface;
var myVar: ResultInterfaceAugmented = maFunction();

关于typescript - 从 NPM 模块中向界面添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42552819/

相关文章:

typescript - 如何为在 ag-grid 单元格渲染中动态创建的按钮引发事件?

TypeScript 2.8 在 Visual Studio 2019 中不可用

typescript - Discord.js 指南 : Property 'commands' does not exist on type 'Client<boolean>' in Typescript

types - 如何编写指针类型的泛型函数?

c# - 检查字符串是否可以转换为另一种类型 (C#)

javascript - 将 javascript 函数动态添加到 Angular 项目

javascript - typescript 错误 - 找不到名称 'require'

python - mypy 如何忽略源文件中的一行?

c - Go 的 interface{} 和 C 中的 void* 一样吗?

scala - 使用 Scala 的结构类型创建更具体的隐式