【问题标题】:Reference other librarys types/interfaces defined in Typescript .d.ts files引用 Typescript .d.ts 文件中定义的其他库类型/接口
【发布时间】:2016-02-15 22:47:48
【问题描述】:

已编辑以尝试更具体(删除旧示例):

我想知道如何在我自己的类和接口中引用 .d.ts 文件中定义的类型或接口作为函数参数或类属性的类型。

这是一个例子。我将解释一些不完全的细节 与问题相关,但解释了代码示例:

var fs = require("fs");
var path = require("path");
var Sequelize = require("sequelize");
var config = require('../config/environment');

class SequelizeDB{
    sequelizeInstance: any;
    sequelize: any;
    modelDirectory: string;
    constructor(Sequelize, dbConfig){  
        //instantiate the sequelize instance object
        this.sequelize  = Sequelize;
        this.sequelizeInstance = this.getDatabaseInstance(this.sequelize,
                                                        dbConfig.databaseName, 
                                                        dbConfig.userName, 
                                                        dbConfig.password, 
                                                        dbConfig.hostName,
                                                        dbConfig.port,
                                                        dbConfig.dialect);
       this.modelDirectory = __dirname + '/sequelize';                                                                                                                                                                                                         
       this.importDataModels();
       this.associateDataModels();
    }
    private getDatabaseInstance(Sequelize,
                        databaseName: string, 
                        userName: string, 
                        password: string, 
                        hostName: string, 
                        port: number, 
                        dialect: string){

        return new Sequelize(
            databaseName, 
            userName,
            password, 
            //options
            {
                host: hostName,
                dialect: dialect,
                port: port,
                pool: {
                    max: 5,
                    min: 0,
                    idle: 10000
            },
        });    
    }
    private importDataModels(){
        //read in all the models from the current folder 
        fs
        .readdirSync(this.modelDirectory)
            .filter((fileName) => {
            return  this.isModelFile(fileName);
        })
        .forEach((file) =>{
            //create the models in the seuelizeInstance
            var model = this.sequelizeInstance.import(path.join(this.modelDirectory, file));
            this[model.name] = model;
        });
    }
    private isModelFile(fileName: string){
        return (fileName.indexOf('.') !== 0) && 
               (fileName !== 'index.js') &&  
               (fileName.indexOf('.map') === -1) &&  //ignore map files
               (fileName.indexOf('.ts') === -1); //ignore ts files
    }
    private associateDataModels(){
        Object.keys(this).forEach((modelName) => {
            if (typeof( this[modelName]) === 'object' &&  'associate' in this[modelName]) {
                this[modelName].associate(this);
            }
       });
    }

};

module.exports = new SequelizeDB(Sequelize, config.sql);

我正在使用 Sequelize,并且我设置了一个模式 根据他们的文档使模型的创建变得容易。这 当前设置对我有用,代码正在做的是创建一个类 创建时设置数据库连接。

然后循环遍历模型文件夹中的所有文件并创建所有模型 使用 Seuquelize.import。

现在我想知道的是如何替换这部分以使用实际的 .d.ts 文件中用于续集的类型(此处)[https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/sequelize/sequelize.d.ts].

在我看来,有一个 Sequelize 静态对象用于创建(小写)sequelize 实例。像这样:

new Sequelize(//config values)

我想将这两个东西存储在我在上面的代码中创建的类中,目前为了让它们通过编译器,我将它们设为any

sequelizeInstance: any;
sequelize: any;

我如何能够利用现有的 Sequelize .d.ts 文件并更明确地了解我期望在该对象中的类型以及传递给其构造函数的类型。

这不是唯一的例子,但我更普遍地问的是我可以在 TypeScript 中创建一个接口或一个类 并强制一个函数采用该特定类或接口,例如:

interface IUser{
    id: number,
    username: string,
    passwork: string    
}

function validateUser(user: IUser): boolean{
    //implementation
}

如果用户界面是在我使用 npm 安装并使用 tsd 安装的节点中的模块中定义的,我该怎么做?

如果这还不够详细,请告诉我,我会尽力解释更多。

【问题讨论】:

  • 你的问题很模糊,请解释一下你想达到什么目的。
  • @gilamran 我已经更新了我的问题。让我知道这是否不够具体。这是我在谷歌上搜索了很长时间的一般实现想法,我确定我只是错过了一些简单的东西。
  • 不要在 Typescript 中使用var ... require,使用import ... from,这也会导入定义

标签: node.js typescript sequelize.js


【解决方案1】:

最简单的就是使用

/// <reference path="../typings/sequelize/sequelize.d.ts" />

从那时起,您将能够使用该 d.ts 文件中的接口。编译器也会知道在编译中包含这个文件,所以丢失的接口不会出错。

您拥有的最高级选项是使用 tsconfig.json(大多数 IDE 都理解此文件),并在 tsconfig.json 中指示您项目的所有文件(包括来自 tsd 的 .d.ts) 并且编译器将“知道”编译中包含的内容。

最好的办法,实际上是像这样导入文件:

import * from '../typings/sequelize/sequelize'; // without extension

编译器会在编译您的代码之前获取该文件。如果它只有环境声明 (d.ts),则不会将其包含在最终结果中(这很好)。

【讨论】:

  • 您能否详细说明 tsconfig.json 选项?我将如何设置这些文件?你可以只导入你的主要 tsd.d.ts 吗?我似乎无法让其他任何一个选项发挥作用,因为我认为我已经尝试过这些选项。但我会再试一次。我觉得如何在 Typescript 中正确地做节点有很大的空间。文档中有少量但不多。
猜你喜欢
  • 2017-05-08
  • 2016-10-18
  • 1970-01-01
  • 2019-07-09
  • 2016-01-02
  • 2016-04-21
  • 2017-07-03
  • 2019-08-22
相关资源
最近更新 更多