如何在打字稿中验证输入标签的类型“target.dataset”属性

Posted

技术标签:

【中文标题】如何在打字稿中验证输入标签的类型“target.dataset”属性【英文标题】:How to validate type "target.dataset" attribute of input tag in typescript 【发布时间】:2019-08-25 16:31:19 【问题描述】:

“数据集”属性始终不允许使用 htmlInputElement。

我搜索了DOM types的文档。任何地方都没有“数据”或“数据集”。

当然,可以在 changeLoginValue 中使用“变量键”下方的“非空”类型。

export interface LoginForm 
    id: string;
    password: string;
    [key: string]: string;


export interface ILoginStore 
    loginValue: LoginForm;
    changeLoginValue(e: React.ChangeEvent<HTMLInputElement>): void;


class LoginStore implements ILoginStore 
    @observable loginValue: LoginForm = 
        id: '',
        password: '',
    

    @action.bound changeLoginValue(e: React.ChangeEvent<HTMLInputElement>): void 
        const key = e.target.dataset.name!;
        this.loginValue[key] = e.target.value;
    

它在应用程序中运行良好。

但这在打字稿中似乎有些棘手,最重要的是它总是无法开玩笑地编译。

我的测试代码是

import LoginStore from './loginStore';

describe('LoginStore', () => 
    it('change id and password in loginValue', () => 
        const event = 
            target: 
                dataset: 
                    name: 'id',
                ,
                value: 'abcdef',
            ,
           as React.ChangeEvent<HTMLInputElement>;

        LoginStore.changeLoginValue(event);

        expect(LoginStore.loginValue.id).toBe('abcdef');
    )
)

声明“const event”时显示打字稿错误:

类型转换'目标:数据集:名称:字符串; ;值:字符串; ; ' 键入 'ChangeEvent' 可能是一个错误,因为这两种类型都没有与另一种充分重叠。如果这是故意的,请先将表达式转换为“未知”。

类型'目标:数据集:名称:字符串; ;值:字符串; ; ' 缺少来自“ChangeEvent”类型的以下属性:nativeEvent、currentTarget、bubbles、cancelable 和 10 more.ts(2352) ###

如何使用“数据集”属性? 我必须为此制作自定义界面吗?

我正在使用

"babel-jest": "^24.5.0",
"jest": "^24.5.0",
"typescript": "^3.4.1"
"ts-jest": "^24.0.1",

【问题讨论】:

【参考方案1】:

eventReact.ChangeEvent 的模拟。

它永远不会匹配预期的类型(它不会实现nativeEventcurrentTargetbubblescancelable 等)。

对于此类情况,您知道您的模拟与预期类型不匹配,并且您希望 TypeScript 让它通过,您可以使用 any 类型...

...选择退出类型检查并让值通过编译时检查。


const event: any =   // <= use 'any' for the mock
  target: 
    dataset: 
      name: 'id',
    ,
    value: 'abcdef',
  ,
;

【讨论】:

非常感谢。我完全理解您的回答,但不想使用“任何”......所以现在我放弃使用“数据集”并使用“名称”属性。再次感谢,但由于缺乏 *** 声誉,我无法投票给您的答案。

以上是关于如何在打字稿中验证输入标签的类型“target.dataset”属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中使用/显示带有html标签的字符串

如何在打字稿中声明函数类型

如何在打字稿中迭代字符串文字类型

如何在打字稿中访问嵌套条件类型

如何理解打字稿中的“属性'名称'在'用户'类型中是私有的”

我们如何在打字稿中获得嵌套对象类型