我有一些打字代码是这样的:

const foo: [string, ...string[]] = ['narf']
const bar: [string, ...string[]] = foo.map((x) => x)

我得到的错误是:Type 'string[]' is not assignable to type '[string, ...string[]]'. ts(2322)

是的,但是map()永远不会改变列表中元素的数量,所以它为什么不返回类型[string, ...string[]]呢?对此推荐的修复方法是什么?

推荐答案

我们只是没有一种很好的方法来表示它,既可以捕捉所有的边缘情况,又可以明智地添加到内置的类型中.虽然你可以用这样的东西来让它工作,

interface Array<T> {
    map<V>(predicate: (value: T, index: number, array: Array<T>) => V): { [K in keyof this]: V };
}

它在某些情况下可能会失败(我已经在unknown[]中发现了一个映射never[]的结果),虽然我们可以修补这些单独的情况(使用更多重载或条件类型),但使用或维护根本不可行.

这个does可以工作,但我不建议增加这样的内置功能……

const foo: [string, ...string[]] = ['narf'];
const bar: [string, ...string[]] = foo.map((x) => x); // okay

相反,我只会使用断言,这样其他查看代码的文字脚本开发人员就不会奇怪,"等一下,为什么这会起作用?"

const foo: [string, ...string[]] = ['narf'];
const bar: [string, ...string[]] = foo.map((x) => x) as [string, ...string[]]; // okay

当然,您可以自由地使用您喜欢的任何方式.

相关:microsoft/TypeScript#29841

Playground


再进行一次理智判断,这在使用上述增强功能时也是有效的.

const baz: [number, ...number[]] = foo.map((x) => x.length);

Typescript相关问答推荐

根据另一个成员推断类成员的类型

在React中实现具有独立页面的嵌套路径的最佳实践是什么?

泛型函数类型验证

替代语法/逻辑以避免TS变量被分配之前使用." "

将值添加到具有不同类型的对象的元素

如何使用函数填充对象?

状态更新后未触发特定元素的Reaction CSS转换

React重定向参数

通配符路径与每条路径一起显示

如何在Angular 12中创建DisplayBlock组件?

如何在TypeScrip中正确键入元素和事件目标?

ANGLE独立组件布线错误:没有ActivatedRouting提供程序

如何创建一家Reduxstore ?

如何将别名添加到vitest配置文件?

常量类型参数回退类型

将布尔值附加到每个对象特性

必需的输入()参数仍然发出&没有初始值设定项&q;错误

如何从抽象类的静态方法创建子类的实例?

Typescript泛型验证指定了keyof的所有键

类型为 `(callback: (...args: T) => void, params: T)` 的函数的泛型