gpt4 book ai didi

javascript - typescript 、导入、 "new"、构造函数和接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 04:01:54 26 4
gpt4 key购买 nike

问题不在于 "problematic aspect" 中的“new”关键字,但更多的是实用方法。

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

因此,许多模块“开箱即用”,无需实例化它们。 (节点模块为示例)

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

为了更好地说明我的意思,假设我有 A 类:

class A implements Letter {
hello(){
console.log("Hello World");
}
}

及其界面“Letter”:

interface Letter {
hello(): void
}

然后我有一个“Book”类,它使用我所说的方法。

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

另一方面,我有“BookVersionJs”,它不使用任何接口(interface)并直接实现它:

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

export class BookVersionJs{
Read(){
console.log("We're about to read this chapter!");
A.Hello();
}
}

然后我们可以这样使用它:

  import {BookVersionJs} from './BookVersionJs'    
BookVersionJs.Read();

但是我失去了接口(interface)给我的“理论上的”松散耦合。理论上是因为 JavaScript 可以用原型(prototype)覆盖它们。

实用性上有差异。我应该在 TypeScript/JavaScript 中瞄准哪个?还是意见问题?

最佳答案

很难确切地说出您在问什么,但我可以肯定地说我喜欢您的 Book 示例的外观远胜于您的 BookVersionJs 示例(尽管两者都有一些语法错误)。

考虑读书。

BookVersionJs

BookVersionJs.Read();   // "I am reading Book"

预订

let book = new Book();
book.Read(); // "I am reading a Book"

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

如果您关心的是可测试性,那么请务必注入(inject)Letter。您可以将 A 保留为默认类型,以便在日常代码中更方便使用,并在单元测试期间提供 Letter 的不同实现。

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();
}
}

关于javascript - typescript 、导入、 "new"、构造函数和接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com