【发布时间】:2021-07-18 10:09:39
【问题描述】:
我对 JavaScript 和 TypeScript 还很陌生。
就我而言,TypeScript 被编译成常规的 JavaScript。
来自 C#,其中对象通过引用传递(如果它们不是原始类型或结构)。我写了一些 TypeScript 代码来测试一些东西:
interface IRunner {
run(): string;
}
class TestDI {
private readonly Runner: IRunner;
constructor(runner: IRunner) {
this.Runner = runner;
}
test(): void {
console.log('Result of runner: ' + this.Runner.run());
}
}
class FooRunner implements IRunner {
run(): string {
return 'Foo';
}
}
class BarRunner implements IRunner {
run(): string {
return 'Bar';
}
}
let runner: IRunner;
runner = new FooRunner();
const SUT: TestDI = new TestDI(runner);
// Expected output: Foo
// Actual output: Foo
console.log(runner.run());
// Expected output: Foo
// Actual output: Foo
SUT.test();
runner = new BarRunner();
// Expected output: Bar
// Actual output: Bar
console.log(runner.run());
// Expected output: Bar
// Actual output: Foo
SUT.test();
在上面的代码中,我将IRunner 接口的一个实例传递给了一个类 c-tor,然后,我的类的一个字段将填充我在 c-tor 中传递的任何内容。
稍后在代码中,我更改了传递给 c-tor 的变量,但是,当我调用 test 函数 Runner 类的字段似乎没有反映对我传递的原始变量所做的任何更改时创建我的 TestDI 类的实例。
在 C# 中,我编写的代码会按照我的预期运行。但这里不是。
发生了什么事?
【问题讨论】:
-
我不明白你为什么期望
Result of runner: Bar是最后一个SUT.test()。为runner分配一个新值,无论它是否为IRunner,不会改变SUT.Runner是什么。 “就我而言,TypeScript 被编译成常规 JavaScript” - 是的,你会在 vanilla JS 中看到相同的行为。 -
@lilbroomstick 你的意思是如果你按值传递一个可变对象?你会在 JS 中看到相同的行为。
-
The same applies to JS@lilbroomstick.
-
@Ivar,是的!我的错!当等效的 C# 代码出现在答案中时,它变得更加清晰。
-
“来自 C#,对象通过引用传递” – 嗯?默认情况下,C# 是按值传递的,除非您明确使用
ref或out请求按引用传递。这里有清楚的记录:docs.microsoft.com/dotnet/csharp/language-reference/keywords/…
标签: javascript typescript pass-by-reference