我使用 Deno 编译一些 TypeScript,然后将其作为网页的一部分提供,以便它在浏览器端运行。我正在尝试在客户端使用 canvas 元素,为此我需要类似CanvasRenderingContext2Dor 的类型CanvasGradient,它们在lib.dom.d.ts中定义,但它们不可用:Deno 编译给出类似 的错误TS2304 [ERROR]: Cannot find name 'CanvasRenderingContext2D'.。(另一方面,类型Path2D(在同一文件中定义)不会引起问题。)
注意:我知道当代码在浏览器中运行时,这些类型将存在于运行时,但我希望 Deno 在编译时了解它们。
我尝试以某种方式包含 .d.ts 文件。我尝试过的事情:
"libs": ["deno.window", "esnext"]在编译器选项中指定等(在 deno.json 中)。/// <reference types="https://raw.githubusercontent.com/microsoft/TypeScript/main/lib/lib.dom.d.ts" />
Run Code Online (Sandbox Code Playgroud)
// @deno-types="https://raw.githubusercontent.com/microsoft/TypeScript/main/lib/lib.dom.d.ts"
Run Code Online (Sandbox Code Playgroud)
其中一些尝试根本不起作用,有些甚至明显没有被解析。看起来我不明白 Deno 如何加载类型定义,例如它Path2D从哪里加载类型声明。如何解决这个问题?
我想知道检查q: Option<String>我拥有的 a 是否具有特定字符串的值的最惯用的方法是什么my_string: String。所以最直接的解决办法是:
if q.is_some() && q.unwrap() == my_string
Run Code Online (Sandbox Code Playgroud)
我能想到的另一种:
if q.unwrap_or_default() == my_string
Run Code Online (Sandbox Code Playgroud)
但这在my_string空的极端情况下不起作用。
另一个:
match q {
Some(s) if s == my_string => {
...
},
_ => {},
}
Run Code Online (Sandbox Code Playgroud)
但这是非常冗长的。
有没有更简单的东西,比如一些聪明的东西if let?
我制作了一个 LED 时钟,它还可以显示天气。我的程序在循环中执行几件不同的事情,每件事情都有不同的时间间隔:
更新 LED 是最关键的:我不希望在获取天气等信息时延迟更新。这应该不是问题,因为获取天气主要是异步 HTTP 调用。
这是我的代码:
let mut measure_light_stream = tokio::time::interval(Duration::from_secs(1));
let mut update_weather_stream = tokio::time::interval(WEATHER_FETCH_INTERVAL);
let mut update_leds_stream = tokio::time::interval(UPDATE_LEDS_INTERVAL);
loop {
tokio::select! {
_ = measure_light_stream.tick() => {
let light = lm.get_light();
light_smooth.sp = light;
},
_ = update_weather_stream.tick() => {
let fetched_weather = weather_service.get(&config).await;
// Store the fetched weather for later access from the displaying function.
weather_clock.weather = fetched_weather.clone();
},
_ = update_leds_stream.tick() …Run Code Online (Sandbox Code Playgroud)