繁体   English   中英

我正在研究 TS 元组,这段代码有什么问题?

[英]I am studying the TS tuples, what's wrong with this code?

typescript 元组没有按我的意愿工作。

tsc版本3.6.4

1、当我像下面这样初始化一个元组时:

let x: [string, number];
x[0] = 'John';

并通过tsc得到以下 javascript :

var x;
x[0] = 'John';

现在用node运行,我得到了这个错误:

/home/peng/ts-learnings/dist/tuple.js:2
x[0] = 'John';
     ^

TypeError: Cannot set property '0' of undefined
    at Object.<anonymous> (/home/peng/ts-learnings/dist/tuple.js:2:6)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
    at internal/main/run_main_module.js:17:11

这是我的tsconfig.json

{
    "include": [
        "src/*.ts"
    ],
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es2016",
        "outDir": "dist/",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "types": [
            "reflect-metadata"
        ]
    }
}

请告诉我有什么问题。

2、而且这段代码也让我很困惑。

type Person = [string, number];
let tom: Person = ['Tom', 35];
tom[0] = 'John';
tom[1] = 25;
tom.pop();
// ['John']
tom.push('test');
// ['John', 'test']

正如一些 TS 教程所说,语句tom.push('test')无法通过编译器检查,因为tom[1]number的类型!

考虑元组的一种好方法,并不是真正将其视为一个数组(即使它在 javascript 中)。

如果您的元组被指定为[string, number] ,则意味着它必须始终按该顺序包含 1 个字符串和 1 个数字。 不多也不少。

如果您对该元组执行.pop() ,您会将项目数减少到 1,这意味着它不再是[string, number]类型。 Typescript 阻止您这样做,因为打字稿的目标之一是确保如果您将变量定义为某种类型,它应该始终是该类型。

所以要回答为什么你不能运行.pop()它真的意味着'你不能因为你告诉 typescript 你的变量总是类型[string, number] 如果您希望能够删除最后一个数字,则需要使用不同的类型。

所以这最终导致了一个 XY 问题。 为什么要这样做?

至于这个片段:

let x: [string, number];
x[0] = 'John';

它不起作用的原因是因为x没有初始化为数组。 它应该更正为:

let x: [string, number];
x = ['John', 25]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM