打字稿元组不能按我的要求工作。
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
的类型!
答案 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]