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

时间:2019-10-29 00:19:36

标签: typescript tuples

打字稿元组不能按我的要求工作。

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的类型!

1 个答案:

答案 0 :(得分:0)

一种考虑元组的好方法是,实际上并没有将其视为数组(即使它是在javascript中)。

如果将元组指定为[string, number],则表示它必须始终按此顺序包含1个字符串和1个数字。不多不少。

如果在该元组上执行.pop(),则将项目数减少为1,这意味着它不再是[string, number]类型。 Typescript阻止您执行此操作,因为Typescript的目标之一是确保将变量定义为某种类型时,该变量应始终为该类型。

所以要回答为什么您不能运行.pop()的真正含义是“您不能这样做,因为您告诉打字稿变量始终是[string, number]类型。如果要删除最后一个号码,则需要使用其他类型。

因此,这最终导致了XY问题。 为什么您要这样做吗?

关于此代码段:

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

之所以不起作用,是因为x未初始化为数组。应该将其更正为:

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