如何在Typescript中检查字符串是否可以转换为自定义类型

4c8rllxm  于 2023-03-24  发布在  TypeScript
关注(0)|答案(1)|浏览(122)

我是Typescript的新手,我有以下类型和界面的数独游戏:

export type GridCellValue = 1|2|3|4|5|6|7|8|9;

export interface GridCell {
  readonly: boolean,
  value: GridCellValue|null,
}

export type Grid = Array<Array<GridCell>>

数独网格中的单元格是HTMLInputElement,当它们的输入改变时,它们会触发InputEventVue@input指令)。
我的验证函数如下:

function validate_input(ev: InputEvent) {
  const input_string: string = ev.data ?? '';
  const grid_cell_value_regex = /^([123456789])$/;
  const value = grid_cell_value_regex.test(input_string) ? input_string : '';
  if (ev.target === null)
    return;
  const el = ev.target as HTMLInputElement;
  el.value = value;
}

我想要的是一种更好的方法来检查input_string是否可以转换为GridCellValue,而不必使用Regex,这可能吗?
我尝试使用instanceofis来检查,但它不起作用。

ctehm74n

ctehm74n1#

Use a type-narrowing function(也称为“类型保护”)与valueAsNumber(为您进行解析)结合使用范围检查,如下所示:

function onInputInput( ev: InputEvent ): void {
    
    const value = (ev.sender as HTMLInputElement).valueAsNumber;
    if( isGridCellValue( value ) ) {
        // do stuff here: TSC will narrow `value` to `GridCellValue` within the scope of this `if` statement's block.
    }
}

function isGridCellValue( value: number ): value is GridCellValue {

    return (
        Math.floor( value ) === value
        &&
        value >= 1
        &&
        value <= 9
    );
}

相关问题