我的代码:
const WEEKDAYS_SHORT: string[] = ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam']
错误消息来自TypeScript(3.0)编译器:
TS2322:类型“string[]”不可分配给类型“[string, string, string, string, string, string, string]”。“string[]”类型中缺少属性“0”。
如果我将字符串[]更改为只读数组
TS2322:“ReadonlyArray”类型不能分配给类型“[string,string,string,string,string,string,string]”。类型“ReadonlyArray”中缺少属性“0”。
我的tsconfig.json:
{
"compilerOptions": {
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es6", "dom"],
"module": "es6",
"moduleResolution": "node",
"sourceMap": true,
"target": "es5",
"jsx": "react",
"strict": true
},
"exclude": [
"**/*.spec.ts",
"node_modules",
"vendor",
"public"
],
"compileOnSave": false
}
如何在TypeScript中定义只读数组?
虽然公认的答案是正确的,但它确实有一个缺点。
const readonlyArray = [1, 2, 3] as const;
let x = 4; // function parameter, etc.
// Argument of type 'number' is not assignable to parameter of type '1 | 2 | 3'.ts(2345)
// if (readonlyArray.includes(x)) {}
一种替代方法是使用只读:
const readonlyArray: readonly number[] = [1, 2, 3];
let x = 4;
if (readonlyArray.includes(x)) {} // OK
// Property 'push' does not exist on type 'readonly number[]'.ts(2339)
// readonlyArray.push(4);
调试后发现不是TypeScript编译器问题,是因为我使用了第三方组件调用DayPicker:
<DayPicker
onDayClick={this.handleDayClick}
selectedDays={posts.day}
months={MONTHS}
weekdaysShort={WEEKDAYS_SHORT}
firstDayOfWeek={1}/>
道具的类型不是字符串,而是字符串,字符串,字符串,字符串
weekdaysShort?: [string, string, string, string, string, string, string];
因此,TS compile表示字符串[]与[string,string,string,string,string,string]不匹配。
最后,我刚刚将类型从string[]
更改为any
,以避免此异常错误消息,当然,我们也可以更改为[string,string,string,string,string]
(太长)。
将数组声明声明为const
;
const readonlyArray = [1, 2, 3] as const;
此外,访问只读数组的元素类型非常简单:
type Element = typeof readonlyArray[number]` // 1 | 2 | 3
因为const
断言适用于任何声明,包括对象和深度嵌套的数据结构。您甚至可以将表达式断言为const
。例如,如果值1
被推断为数字
,但您想提供数字文字类型,只需将其1断言为const
。该功能是在TypeScript3.4
中引入的。您也可以引用文档。
考虑到readOnly
或const
数组通常称为元组(就像Python引用中的情况一样)。元组可以有相同类型的元素或完全不同类型的元素。请注意,在上面的示例中,Element
类型不是推断为number
,而是推断为数字文字的联合。这是可能的,因为元组的元素永远不会改变。推断最窄的可能类型是实用的。例如,您可以在需要数字
的任何地方使用数字文字类型1
,但不能在需要数字文字类型1
的地方使用数字
类型。
两个元素的元组通常称为一对,可以表示为乘积。虽然[number, string]
的乘积不是数字,但您仍然可以将它们相乘。因为string
和number
本身都无限大,所以它们的乘积类型也是如此。考虑[1|2|3,'a'|'b'|'c']
的更简单示例,它等于:
[1, 'a']
| [1, 'b']
| [1, 'c']
| [2, 'a']
| [2, 'b']
| [2, 'c']
| [3, 'a']
| [3, 'b']
| [3, 'c']
进一步阅读:
我有以下代码: 我遇到一个错误,指向.find并说: “字符串”类型的变量中不存在属性find。我知道错误在说什么,但是我如何将< code>$modal定义为一个我可以使用< code >的变量。查找于? 同样,现在我在typescript世界里,有没有更好的方法来定义modal,而不是在这里将它定义为var?
我在AngularJS 1.X项目上使用Typescript。我出于不同的目的使用不同的Javascript库。为了对我的源代码进行单元测试,我想使用类型(= 接口)存根一些依赖项。我不想使用 ANY 类型,也不想为每个接口方法编写一个空方法。 我正在寻找一种方法来做这样的事情: 我现在的痛苦是,我要么使用< code>any并实现我的测试用例中调用的所有方法,要么实现接口并实现完整的接口。那太多
我正在处理打字稿,并将一个函数传递给另一个函数。 如果我有一个传递到typescript中另一个函数的函数,我应该如何编写类型? 我尝试了,但似乎不起作用。
问题内容: 我想为我的纯功能组件定义,但出现类型错误: 我知道我可以这样写: 有没有更好的添加方法? 问题答案: 您可以这样输入: 然后,你可以写,而无需强制转换的类型(会)。
我想知道最好的方法,比如我有两个物体 如果objectC由创建 我如何声明/描述objectC,以便编译器/IDE知道它同时具有objectA和objectB的属性? 我想找到一种不需要为objectA和objectB定义接口的方法。我不想为同一个属性写两次声明和定义/求值。如果我在一个对象上有太多的属性,这种冗余是很重要的。 (是否有一个运算符可以提取现有对象的接口/类型?) 可能吗?
我正在努力寻找 有什么不同?