我已经构建了一个HttpInterceptor紧跟 Angular 文档中的那个。
但是,作为拦截器的一部分,我需要进行异步调用。我用代码的简化版本(但语义相同)创建了一个StackBlitz。
拦截器看起来像:
export class AuthInterceptor implements HttpInterceptor {
constructor(private session: SessionService, private config: ConfigurationService) {}
intercept(req: HttpRequest<any>, next: HttpHandler) {
const apiRoot = this.config.apiUrl;
if (apiRoot && req.url.startsWith(apiRoot)) {
return this.addAuth(req).pipe(switchMap(x => next.handle(x)));
} else {
return next.handle(req);
}
}
private addAuth(original: HttpRequest<any>): Observable<HttpRequest<any>> {
return from(this.session.getToken()).pipe(
map(token => {
const req = original.clone({
setHeaders: { Authorization: `Bearer ${token}` }
});
return req;
})
);
}
}
Run Code Online (Sandbox Code Playgroud)
这很简单:
req.url.startsWith() …unit-testing angular-http-interceptors angular angular-unit-test
所以,我想写一个通用方法。为了解决这个问题,假设我想连接来自同一类型的 2 个不同对象的 2 个字符串属性。
function concat<T>(target1: T, target2: T, key: keyof T): string {
return target1[key] + target2[key];
}
Run Code Online (Sandbox Code Playgroud)
上面的代码无法编译,因为编译器没有指示我key只想限制为 type 的属性列表string。
TypeScript 目前不支持此功能吗?
我知道我可以进行运行时检查,但我想要对此进行编译时检查。
下午好,
我从几年前继承了一些C#代码.我已经重构了一点异步.评估我的更改对CPU性能的影响,我使用Process Explorer大致观察我的应用程序在做什么.令我惊讶的是,它似乎正在进行Process Explorer报告的I/O. 通常,这与磁盘I/O或网络I/O有关.根据我所看到的代码,我无法找出对这两个I/O源中的任何一个的显式调用.
我的问题是:确定哪一部分代码导致I/O的最佳方法是什么?我们使用JetBrains中的dotTrace来分析我们的应用程序,但是,据我所知,它只处理CPU和内存性能.
提前感谢任何指针.
问候,
埃里克.
我是一个很长时间的C#开发人员,最近不得不查看一些VB6代码.经过一番挖掘,我们发现,在某个地方,某种程度上,我们将数字存储为字符串.现在我们正在阅读它,我们的代码并没有很好地处理文化差异.这是一个例子:
Dim text as String
Dim myVal as Double
Set text = "1,123456"
'This sets the value of myVal to 1123456 on our system - incorrect
myVal = text
Set text = "1.123456"
'This sets the value of myVal to 1.123456 on our system - correct
myVal = text
Run Code Online (Sandbox Code Playgroud)
请记住,这是VB6而不是VB.NET,是否有任何内置的方法,函数,无论什么,可以使用特定的文化将字符串转换为double?或者至少,暗示我们可能正在处理不同格式的转换?
我们仍在挖掘如何编写价值,看看我们是否可以对流程进行逆向工程,以便为我们提供一致的结果.但是,我们的客户已经拥有(拥有)一种格式或另一种格式(或两者,我们正在检查......)的数据,因此此时正确的转换算法或实现将是更好的答案.
好,
我们的代码中有很多where子句.我们只是尽可能多的方式来产生一个字符串来表示的条件.我试图想出一个干净的方式如下:
public static string Join<T>(this IEnumerable<T> items, string separator)
{
var strings = from item in items select item.ToString();
return string.Join(separator, strings.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
它可以使用如下:
var values = new []{1, 2, 3, 4, 5, 6};
values.StringJoin(",");
// result should be:
// "1,2,3,4,5,6"
Run Code Online (Sandbox Code Playgroud)
所以这是一个很好的扩展方法,可以完成一项非常基础的工作.我知道简单的代码并不总是变成快速或有效的执行,但我只是好奇我能用这个简单的代码错过了什么.我们团队的其他成员争辩说:
任何专家都会加入?
问候,
埃里克.
我正在尝试为我们网站的javascript创建一个"全局"配置结构.我想要做的是这样的事情:
company.config.serviceUrl = "http://yoursite.com/servic";
company.config.serviceKey = "123456789ABCDEF";
Run Code Online (Sandbox Code Playgroud)
在C#中(是的,我是一个C#人),这将是一个静态类config,在company命名空间内有几个静态属性serviceUrl和serviceKey.
知道如何在TypeScript中执行此操作吗?我设法"做到了",但是看着生成的javascript,我不确定这个Config类是公开的是我想要的.
这是源TypeScript:
module company{
export class Config {
serviceUrl = "";
serviceKey = "";
}
export var config = new Config();
}
company.config.serviceUrl = "http://yoursite.com/service";
company.config.serviceKey = "123456789ABCDEF";
Run Code Online (Sandbox Code Playgroud)
生成的javascript:
var company;
(function (company) {
var Config = (function () {
function Config() {
this.serviceUrl = "";
this.serviceKey = "";
}
return Config;
})();
company.Config = Config;
company.config = new Config(); …Run Code Online (Sandbox Code Playgroud) 我的节点服务器崩溃并显示以下日志。
<--- Last few GCs --->
504158 ms: Mark-sweep 1379.9 (1434.3) -> 1379.0 (1434.3) MB, 1486.7 / 0.0 ms [allocation failure] [GC in old space requested].
505610 ms: Mark-sweep 1379.0 (1434.3) -> 1379.0 (1434.3) MB, 1452.0 / 0.0 ms [allocation failure] [GC in old space requested].
507067 ms: Mark-sweep 1379.0 (1434.3) -> 1379.0 (1406.3) MB, 1456.1 / 0.0 ms [last resort gc].
508505 ms: Mark-sweep 1379.0 (1406.3) -> 1379.0 (1406.3) MB, 1438.3 / 0.0 ms [last resort gc].
Run Code Online (Sandbox Code Playgroud)
我了解 Mark-sweep …
我喜欢TypeScript中的字符串文字联合类型.我遇到了一个简单的案例,我希望保留联合类型.
这是一个简单的版本:
let foo = false;
const bar = foo ? 'foo' : 'bar';
const foobar = {
bar
}
Run Code Online (Sandbox Code Playgroud)
bar正确输入为'foo' | 'bar':
但foobar.bar输入为string:
只是好奇为什么.
所以@jcalz和@ggradnig确实做得很好.但后来我意识到我的用例有一个额外的转折:
type Status = 'foo' | 'bar' | 'baz';
let foo = false;
const bar: Status = foo ? 'foo' : 'bar';
const foobar = {
bar
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,bar确实有一种类型Status.但是foobar.bar还有一种类型'foo' | 'bar'.
似乎让它表现得如我所期待的唯一方法是投射'foo'到Status:
const bar = …Run Code Online (Sandbox Code Playgroud) typescript ×3
c# ×2
angular ×1
generics ×1
javascript ×1
localization ×1
node.js ×1
optimization ×1
profiling ×1
union-types ×1
unit-testing ×1
v8 ×1
vb6 ×1
windows ×1