TypeScript的字符串枚举 - “类型...不能分配给类型...”

时间:2017-07-19 13:02:29

标签: typescript enums visual-studio-2017 typescript2.4

我最近将TypeScript的版本从2.3.4升级到2.4.0,希望使用string enums。然而令我沮丧的是,我收到了错误消息:

<ListView Width="Auto" Height="Auto" Margin="10" Background="#092E3E" Foreground="White" ItemsSource="{Binding BackupEvents}" >
    <!-- HERE: -->
    <ListView.Resources>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
        </Style>
    </ListView.Resources>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            ...
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView AllowsColumnReorder="False">
            <GridView.ColumnHeaderContainerStyle>
                ...
            </GridView.ColumnHeaderContainerStyle>

            <GridView.Columns>
                <GridViewColumn Width="200" Header="Time" DisplayMemberBinding="{Binding LVTime}"/>

                // auto or fixed?
                <GridViewColumn Width="Auto"/"520" Header="Details" DisplayMemberBinding="{Binding LVDetails}"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

错误消息适用于以下代码段(带行号):

Severity  Code    Description Project File    Line    Suppression State
Error TS2322  Type '"E"' is not assignable to type
'StepType'.   ClientApp (tsconfig
project)  Z:\SMART\Smart\Smart\ClientApp\app\models\process.model.ts  17  Active
Error TS2322  Type '"S"' is not assignable to type
'StepType'.   ClientApp (tsconfig
project)  Z:\SMART\Smart\Smart\ClientApp\app\models\process.model.ts  14  Active
Error TS2322  Type '"A"' is not assignable to type
'StepType'.   ClientApp (tsconfig
project)  Z:\SMART\Smart\Smart\ClientApp\app\models\process.model.ts  15  Active
Error TS2322  Type '"D"' is not assignable to type
'StepType'.   ClientApp (tsconfig
project)  Z:\SMART\Smart\Smart\ClientApp\app\models\process.model.ts  16  Active

我正在使用声称安装了TypeScript 2.4.0的Visual Studio 2017:

enter image description here

我搜索了TypeScript's issues,但没有运气。有人知道如何解决它吗?

9 个答案:

答案 0 :(得分:24)

这是因为打字稿版本。

打开命令提示符或终端。然后运行这些命令。

检查TypeScript版本

tsc -v

应高于2.4

如果没有。

全球安装最新版本的打字稿

npm install typescript -g

打开项目的package.json文件 并使用新安装的版本

更改这样的打字稿版本
"typescript": "~2.6.1"

然后删除node_modules文件夹

使用

清理缓存
npm cache clean

最后运行

npm install

*请注意:您可以使用 npm update 更新npm,但不确定要更新的打字稿版本*

答案 1 :(得分:7)

这是使用早于2.4的打字稿版本进行编译时出现的错误。我可以建议的是,你的Visual Studio副本以某种方式获取了自己的旧版本的打字稿,而不是使用项目中安装的较新版本。有关更新打字稿的说明,请参阅维基https://github.com/Microsoft/TypeScript/wiki/Updating-TypeScript-in-Visual-Studio-2017

PS C:\temp> cat t.ts
enum StepType {
    Start = 'S',
    Activity = 'A',
    Decision = 'D',
    End = 'E'
}
PS C:\temp> node somepath\node_modules\typescript\bin\tsc --version
Version 2.2.2
PS C:\temp> node somepath\node_modules\typescript\bin\tsc t.ts
t.ts(2,13): error TS2322: Type '"S"' is not assignable to type 'StepType'.
t.ts(3,16): error TS2322: Type '"A"' is not assignable to type 'StepType'.
t.ts(4,16): error TS2322: Type '"D"' is not assignable to type 'StepType'.
t.ts(5,11): error TS2322: Type '"E"' is not assignable to type 'StepType'.
PS C:\temp> tsc --version
Version 2.4.1
PS C:\temp> tsc t.ts
PS C:\temp>

答案 2 :(得分:5)

Duncan's answer的启发,我找到了根本原因。尽管该应用程序使用的是TypeScript 2.4,但VS的IntelliSense仍然停留在2.3版本中。 VS IntelliSense was not updated

解决此问题的方法是下载并安装TypeScript 2.4 SDK,然后从新版本的选项中进行选择:

enter image description here

答案 3 :(得分:1)

对我来说,问题是@angular/cli使用的是较低版本的Typescript。看看你的锁文件。它显示要求<2.4.0。例如,我们的项目使用yarn.lock

编译时,它会抛出与低版本的Typescript相关的错误。为了解决这个问题,我在前面添加了兼容标志^。所以对我们来说,它始于:

"@angular/cli": "1.2.5"

...改为:

"@angular/cli": "^1.2.5"

这似乎解决了这个问题。值得注意的是,它实际上迫使cli使用Typescript的工作区版本。对我们来说,这是2.4.0,这个版本的cli在技术上并不兼容(因为它需要&lt; 2.4.0)。它在编译时会发出警告,但它暂时成功地为我们工作。

答案 4 :(得分:0)

我的Angular2项目遇到了同样的问题。我需要在Angular2项目中更新Typescript(TS)库。

1)在你的package.json中,将它添加到&#34; devDependencies&#34;部分:

"ts-node": "~3.2.0",
"tslint": "~5.7.0",
"typescript": "~2.4.2"

所以我看起来像:

  "devDependencies": {
    "@angular/compiler-cli": "^2.3.1",
    "@types/jasmine": "2.5.38",
    "@types/node": "^6.0.42",
    "angular-cli": "1.0.0-beta.28.3",
    "codelyzer": "~2.0.0-beta.1",
    "jasmine-core": "2.5.2",
    "jasmine-spec-reporter": "2.5.0",
    "karma": "1.2.0",
    "karma-chrome-launcher": "^2.0.0",
    "karma-cli": "^1.0.1",
    "karma-jasmine": "^1.0.2",
    "karma-remap-istanbul": "^0.2.1",
    "protractor": "~4.0.13",
    "ts-node": "~3.2.0",
    "tslint": "~5.7.0",
    "typescript": "~2.4.2"
  }

2)删除&#34; node_modules&#34;包和&#34; package-lock.json&#34;来自项目的文件。

3)&#34; npm install&#34;在命令行上安装所有新的TS库。

答案 5 :(得分:0)

在Visual Studio 2017 15.3和更高版本中,使用的TypeScript版本绑定到单个项目。

参考-https://github.com/Microsoft/TypeScript/wiki/Updating-TypeScript-in-Visual-Studio-2017

答案 6 :(得分:0)

如果您像我一样,使用VS而不是在项目中使用(只需打开一个文件夹),那么我只需要为VS安装最新版本的TS:

https://marketplace.visualstudio.com/items?itemName=TypeScriptTeam.typescript-27-vs2017

答案 7 :(得分:0)

如果您使用的是Visual Studio 2017社区版本。您不会在“工具/选项”中找到TypeScript智能感知。 您应该编辑项目文件.jsproj。 TypeScriptToolsVersion

并将TypeScriptToolsVersion更新为2.6.2或最新版本。

答案 8 :(得分:0)

使用'any'的类型转换将解决:

enum StepType {
    ENGLISH = <any>'S',
}