typescript - 为什么 Typescript 会忽略超出已知大小的元组内容?

标签 typescript types tuples

有没有办法让 Typescript 不允许这样做?

type TwoItemTuple  = [string, string];
const uh: TwoItemTuple = ['a', 'b', 'a']

如果不是,背后的原因是什么?

最佳答案

你也可以尝试这样的事情:

type OnlyTwo<T1, T2 = T1> = [T1, T2] & {
    0: T1;
    1: T2;
    2?: never;
}

var x: OnlyTwo<number> = [1, 1]; // Okay;
var y: OnlyTwo<number> = [1, 1, 1]; // Error
var z: OnlyTwo<number> = [1, 1, undefined]; // Error
var o: OnlyTwo<number> = [1]; // Error
var b: OnlyTwo<number> = [1, 1, 1, 1] // Error

var s1: OnlyTwo<number, string> = [1, "a"] // Okay
var s1: OnlyTwo<number, string> = [1, "a", 1] // Error

据我所知,对于该类型,唯一可以分配给它的是一个数组文字,其中恰好有两个正确类型的项目。

一个问题是您可以使用 pushpop 修改这些数组,这会将实际值变成不再符合类型的值。谨慎使用。

关于typescript - 为什么 Typescript 会忽略超出已知大小的元组内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48122528/

相关文章:

typescript - 使用 webpack 从 html 文件加载挖空模板

c# - 在运行时获取非泛型 IDictionary 的键和值类型

java - Java 中的返回类型 Boolean

python - 将列表转换为二元组列表

list - Haskell 列表对到列表对

c# - 将数组转换为元组?

javascript - toLocaleDateString 在 TypeScript 中不起作用?

node.js - 将 global.d.ts 正确导出到 npm 包中

javascript - 在 Angular 10 中两次显示 ng-content

c# - 通过 Activator.CreateInstance 检查对象是否为接口(interface)