小编Gle*_*ney的帖子

为什么泛型类型推断不能从两个站点推断出联合?

考虑

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 不推断使其正在处理的代码有效的类型?是否有一份从实际调用中推断通用参数的简明文字,并提供足够的详细信息以理解它bigintmypair调用中选择的原因?(关于泛型的 TypeScript 手册页面没有涵盖两次使用该参数的情况。)也许最重要的是,有没有一种方法可以让我定义我的泛型,以便简单的调用 mypair(x,y) 能够推断出类型(typeof x) | (typeof y)

type-inference typescript typescript-generics

6
推荐指数
1
解决办法
90
查看次数

如何执行 JavaScript ES6 导入并回退到本地副本?

如果我有一个模块“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)

javascript import ecmascript-6

5
推荐指数
0
解决办法
1518
查看次数

C++20 及更高版本:哪些视图/算法可以通过管道传输?

使用 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)

这里的理由是什么?我如何知道哪些与系列相关的漂亮设施可以合并到管道中?(后者是我凭直觉写的;从概念上讲,这似乎是执行此操作的“新范围方式”。)

c++ std-ranges

3
推荐指数
1
解决办法
337
查看次数