类型:类型变量与类型:字符串

Posted

技术标签:

【中文标题】类型:类型变量与类型:字符串【英文标题】:type: typeof variable vs type: string 【发布时间】:2020-01-07 21:38:16 【问题描述】:

在我构建 react redux 应用程序时收到警告消息:

"message": "Type ' type: string; payload: Text[]; ' 不可分配给 type 'MessageAction'。\n 属性 'type' 的类型不兼容。\n Type 'string' 是不可分配给类型 '\"MESSAGES_ACTIONS_SUCCESS\"'.",

所以:

src/pages/home/modules/types.ts中的1和2有什么不同

// src/pages/home/modules/types.ts
1. got warn msg
export const MESSAGES_ACTIONS_SUCCESS = "MESSAGES_ACTIONS_SUCCESS"

export interface MessageAction 
  type: typeof MESSAGES_ACTIONS_SUCCESS
  payload: Text[]


2.no warn msg
export const MESSAGES_ACTIONS_SUCCESS = "MESSAGES_ACTIONS_SUCCESS"

export interface MessageAction 
  type: string
  payload: Text[]

// src/pages/home/modules/actions.ts
import  Dispatch  from "redux"

import  MESSAGES_ACTIONS_SUCCESS, MessageAction  from "./types"

export const loadMessageData = () => async (
  dispatch: Dispatch
): Promise<MessageAction> => 
  const messages: Text[] = await new Promise(resolve => 
    setTimeout(() => resolve([ text: "home ~~~~~~" ]))
  )

  return dispatch(
    type: MESSAGES_ACTIONS_SUCCESS,
    payload: messages
  )

更多信息代码回购是 https://github.com/77xi/s-s-r/pull/5

【问题讨论】:

【参考方案1】:

我重写了您提供的代码以创建一个稍微简单的失败案例:

const MESSAGES_ACTIONS_SUCCESS = "MESSAGES_ACTIONS_SUCCESS";

interface MessageActionOne 
  type: typeof MESSAGES_ACTIONS_SUCCESS;
  payload: Text[];


interface MessageActionTwo 
  type: string;
  payload: Text[];


// Infered type will be:  type: string; payload: never[]; 
const action = 
  type: MESSAGES_ACTIONS_SUCCESS,
  payload: []
;

const one: MessageActionOne = action;
//    ^^^  Type 'string' is not assignable to type '"MESSAGES_ACTIONS_SUCCESS"'

Here is the TypeScript playground

问题在于,在此示例中 action 被推断为 type: string 而不是 type: "MESSAGES_ACTIONS_SUCCESS"

如果您用as const 更新了第一行,应该可以解决这个打字问题:

const MESSAGES_ACTIONS_SUCCESS = "MESSAGES_ACTIONS_SUCCESS" as const;

interface MessageActionOne 
  type: typeof MESSAGES_ACTIONS_SUCCESS;
  payload: Text[];


interface MessageActionTwo 
  type: string;
  payload: Text[];


// Infered type will be:  type: "MESSAGES_ACTIONS_SUCCESS"; payload: never[]; 
const action = 
  type: MESSAGES_ACTIONS_SUCCESS,
  payload: []
;

const one: MessageActionOne = action;

Here is the TypeScript playground for the fixed example.

const 断言已在 TypeScript 3.4 和 you can read more here about them 中添加。突出显示的第一个问题是您遇到的问题:

不应扩大该表达式中的文字类型(例如,不要从“hello”变为字符串)

【讨论】:

export const MESSAGES_ACTIONS_SUCCESS: string = "MESSAGES_ACTIONS_SUCCESS" 也可以解决这个问题 是的,但是你会失去一些类型安全性。 也得到 lint err 从字符串文字中简单推断的类型字符串,删除类型注释 @typescript-eslint/no-inferrable-types

以上是关于类型:类型变量与类型:字符串的主要内容,如果未能解决你的问题,请参考以下文章

数据类型与变量

静态与动态类型

包看包会的变量与数据类型

es6新增--变量定义与变量类型

java八大基本数据类型与运算符

java八大基本数据类型与运算符