考虑
const pairer = <T,>(a: T, b:T) => ({a, b})
const mypair = pairer(3n, true)
Run Code Online (Sandbox Code Playgroud)
这是 TypeScript 4.9 中的一个错误,即
boolean 类型的参数不可分配给 bigint 类型的参数
很明显,TS 在调用中推断 T 为 bigint,导致调用无效。但是 T 有一个非常好的类型可以使调用合法,即bigint | boolean:
const myotherpair = pairer<bigint | boolean>(3n, true)
Run Code Online (Sandbox Code Playgroud)
编译并运行良好。
为什么 TypeScript 不推断使其正在处理的代码有效的类型?是否有一份从实际调用中推断通用参数的简明文字,并提供足够的详细信息以理解它bigint在mypair调用中选择的原因?(关于泛型的 TypeScript 手册页面没有涵盖两次使用该参数的情况。)也许最重要的是,有没有一种方法可以让我定义我的泛型,以便简单的调用 mypair(x,y) 能够推断出类型(typeof x) | (typeof y)?
如果我有一个模块“externals.js”,其中包含:
import * as three from "'https://cdn.jsdelivr.net/npm/three@0.110.0/build/three.module.js";
export three;
Run Code Online (Sandbox Code Playgroud)
然后我可以毫无困难地从“main.js”使用它,如下所示:
import three as J3 from "./externals.js";
var renderer = new J3.WebGLRenderer();
// ... do lots of cool stuff with the renderer
Run Code Online (Sandbox Code Playgroud)
特别是,当执行到调用 WebGLRenderer 时, Three.js 已全部加载,并且我成功获得了渲染器。
但是,如果我想遵循使用 Google 托管 jQuery 的最佳方式似乎是最佳实践,但回退到我在 Google 上的托管库失败并回退到本地缓存的副本,以防 cdn.jsdelivr.net无法访问,我能找到在“externals.js”中执行操作的唯一方法是使用异步函数和动态导入,如下所示:
export var three;
export var threeLoaded = new Promise(async function(resolve, reject) {
var success = false;
try {
three = await import('https://cdn.jsdelivr.net/npm/three@0.110.0/build/three.module.js');
console.log("original import OK");
success = true;
} catch(err) {
try {
three …Run Code Online (Sandbox Code Playgroud) 使用 g++-std=C++20或更高版本,可以编译以下内容(假设 vec 是适当类型的向量):
auto isEven = [](auto i) { return i % 2 == 0; }
auto filtered = vec | std::views::filter(isEven);
auto minEven = std::ranges::min_element(filtered);
Run Code Online (Sandbox Code Playgroud)
但以下情况则不然( 的参数数量错误std::ranges::__min_element_fn):
auto isEven = [](auto i) { return i % 2 == 0; }
auto minEven = vec | std::views::filter(isEven) | std::ranges::min_element();
Run Code Online (Sandbox Code Playgroud)
这里的理由是什么?我如何知道哪些与系列相关的漂亮设施可以合并到管道中?(后者是我凭直觉写的;从概念上讲,这似乎是执行此操作的“新范围方式”。)