首页 > 解决方案 > 缩小类型

问题描述

我正在尝试实现满足一种类型的东西,但该类型的更具体的版本。

type A = 'number' | 'string'

type B = {
    [prop: string]: (
        input: { [key: string]: A },
    ) => number
}

const test: B = {
    prop: (input: { a: string, b: string }) => 0
}

这会产生错误:

Type '{ [key: string]: A; }' is missing the following properties from type '{ a: string; b: string; }': a, b

但我认为它应该编译,因为{ a: string, b: string }满足约束{ [key: string]: A; }

我怎样才能做到这一点?

标签: typescript

解决方案


在您的示例中,它无法编译,因为a: string, b: string不符合初始类型{ [key: string]: A }

除非您也告诉它(强制使用强制转换),否则 Angular无法知道这a是 astring而不是 a 。number


我会更改您的代码并使用模板来定义input.

喜欢 :

操场

type B<T extends {
    [key: string]: unknown;
} = any> = {
    prop: (
        input: { 
            [key in keyof T]: T[key];
        },
    ) => number;
}

type C = {
    a: string;
    b: string;   
};

const test: B<C> = {
    prop: (input) => {

        return 0;
    },
};

图片


推荐阅读