Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类型脚本、导入、“新建”、构造函数和接口?_Javascript_Typescript_Import_Constructor - Fatal编程技术网

Javascript 类型脚本、导入、“新建”、构造函数和接口?

Javascript 类型脚本、导入、“新建”、构造函数和接口?,javascript,typescript,import,constructor,Javascript,Typescript,Import,Constructor,问题不在于中的新关键字,而在于实际方法 在定义ES2015类时,我有点与我的C和JavaScript思维模式格格不入。在C中,我使用依赖项注入将依赖项注入类的构造函数中。在JavaScript中,由于其原型性质,我了解到无需将依赖项注入构造函数;您可以安全地使用导入,因为您可以稍后模拟该方法进行单元测试 因此,许多模块只是开箱即用,不需要实例化它们。节点模块就是例子 我一直在我的项目中使用TypeScript。如您所知,您可以使用它的接口。到目前为止,我一直在做的是将接口设置为属性,然后将相关类

问题不在于中的新关键字,而在于实际方法

在定义ES2015类时,我有点与我的C和JavaScript思维模式格格不入。在C中,我使用依赖项注入将依赖项注入类的构造函数中。在JavaScript中,由于其原型性质,我了解到无需将依赖项注入构造函数;您可以安全地使用导入,因为您可以稍后模拟该方法进行单元测试

因此,许多模块只是开箱即用,不需要实例化它们。节点模块就是例子

我一直在我的项目中使用TypeScript。如您所知,您可以使用它的接口。到目前为止,我一直在做的是将接口设置为属性,然后将相关类设置为属性

为了更好地说明我在说什么,假设我有A级:

class A implements Letter {
    hello(){
        console.log("Hello World");
    }
}
及其接口字母:

interface Letter {
    hello(): void
}
然后我有一本使用我所说方法的教科书

export class Book{
    letter : Letter
    constructor(){
        this.letter = A; 
    }
    Read(){
        console.log("We're about to read this chapter!");
        this.letter.hello();
    }
}
它可以这样使用:

import {Book} from './book' 
let book = new Book();
    book.Read();
  import {BookVersionJs} from './BookVersionJs'    
    BookVersionJs.Read(); 
另一方面,我有BookVersionJs,他不使用任何接口,直接实现它:

import {A} from './a.ts';

export class BookVersionJs{
    Read(){
        console.log("We're about to read this chapter!");
        A.Hello(); 
    }
}
然后我们可以这样使用它:

import {Book} from './book' 
let book = new Book();
    book.Read();
  import {BookVersionJs} from './BookVersionJs'    
    BookVersionJs.Read(); 
但是我失去了接口给我的理论上的松散耦合。理论上,因为JavaScript可以用原型覆盖它们


实用性是不同的。在TypeScript/JavaScript中,我应该瞄准哪一个?还是意见问题

很难说清楚你在问什么,但我可以肯定地说,我更喜欢你的书籍示例的外观,而不是你的BookVersionJs示例,尽管它们都有一些语法错误

想想看书吧

BookVersionJs

您的对象应该在语义上有意义,否则任何使用您的代码的人都会感到非常困惑

如果您关心的是可测试性,那么请务必插入该信函。您可以保留A作为默认类型,以便在日常代码中更容易使用,并在单元测试期间提供不同的字母实现

export class Book{
    letter : Letter;
    constructor(letter: Letter = new A()) { // Note: Assign instance of A, not just A. A is a type, not a value.
        this.letter = letter; 
    }
    Read(){
        console.log("We're about to read this chapter!");
        this.letter.hello();
    }
}

您不能执行A.hello,因为A是一个类,而不是一个实例。您需要要么执行新的A.hello,要么将hello方法设为静态。@NitzanTomer ooooohohh我终于找到了它。问题是,我总是因为传输而感到困惑。这个答案和我想说的有很大关系。是的。问题解决了。多亏了你的评论,我终于找到了我想要的东西;谢谢你,米奇。我在TypeScript上的单个文档上快速编写了代码,没有检查任何内容。我真正想问的是,如果TypeScript/JavaScript方式不直接实例化一个类和一个静态方法更好,或者我应该继续Java/C方式并新建对象?这可能是主观的,但我说是的,一定要使用new;特别是如果您使用的是TypeScript而不是普通的JavaScript。TypeScript完全包含了整个基于类的方法,回到一种更实用的风格意味着使用TypeScript有点多余和浪费。