将扩展类型的对象分配给基类型的对象时,我可以获得正确的类型吗

尼他明

我有这些接口:

interface BasicThing {
    someType: string
    property0: string
}
interface SpecificThing1 extends BasicThing {
    someType: 'special1'
    property1: number
}
interface SpecificThing2 extends BasicThing {
    someType: 'special2'
    color: string
}

在我的代码中我有这个变量

let myThing: BasicThing

稍后我将分配给其中一个SpecificThing1SpecificThing2(或其他)。

现在,如果我想要一个SpecificThing1分配,我可以这样做:

myThing = {
    someType:  'special1',
    property0: 'asdf',
    property1:  42
} as SpecificThing1

但是这样做,如果我为属性分配了错误的类型(如property1: '42' // string is not compatible with number,我只会得到输入错误,但缺少属性根本不会引发任何错误:

myThing = {
    someType:  'special1',
    property0: 'asdf'
    // property1 is missing here, but no typing errors
} as SpecificThing1

解决此问题的一种黑客方法是:

myThing = ((): SpecificThing1 => {
    return {
        someType: 'special1',
        property0: 'asdf',
        // property1: 123 // Now we get the typing error: 'property1 is missing in type...'
    }
})()

但这看起来不太好,创建一个作用域只是为了获得该对象的正确类型感觉不太对。

是否可以在创建对象时为对象分配类型,而不仅仅是在接收端?难道这不能以更优雅的方式进行吗?

提香·切尔尼科娃-德拉戈米尔

您可以使用联合类型而不是基类型。效果几乎相同,您将可以访问属于其中的属性的公共属性BaseThing(尽管如果派生类型具有它们,您可能会获得其他公共属性)

let d2: SpecificThing1 | SpecificThing2 = {
    someType: 'special1',
    property0: '0',
    property1: 1
}
let based: BasicThing = d2;

另一种解决方案是定义一个中间变量,永远不要直接分配基类型的变量

let o: SpecificThing1 = {
    someType: 'special1',
    property0: '0',
    property1: 1
}, d: BasicThing = o;

另一种选择是定义一个辅助函数,您可以在其中指定泛型参数,并且检查将按预期执行:

const literal = <T>(o: T) => o;

let d: BasicThing = literal<SpecificThing1>({
    someType: 'special1',
    property0: '0',
    property1: 1
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将变量分配给相同类型的对象时,类型不匹配错误

来自分类Dev

将匿名对象分配给类型属性时,TypeScript是否会推断强制类型转换?

来自分类Dev

将通用对象分配给Partial类型

来自分类Dev

当listIterator用作引用类型时,分配给它的对象必须实现它吗?

来自分类Dev

C ++将类型A的变量分配给扩展了A的类型B

来自分类Dev

类型对象不可分配给类型 any[]

来自分类Dev

当使用=将一个对象分配给另一个对象时,将进行复制类型

来自分类Dev

当推入存储在对象中的数组时,类型的参数不能分配给类型错误的参数

来自分类Dev

如何检查分配给变量的对象的类型是否正确?

来自分类Dev

类型安全分配给字符串中键的对象

来自分类Dev

无法将对象分配给文字类型

来自分类Dev

将类型分配给Maybe类型的嵌套类型的属性

来自分类Dev

调用方法vs将对象分配给方法AND空返回类型vs对象返回类型

来自分类Dev

即使是强类型,也将值作为字符串分配给对象

来自分类Dev

这段代码如何将子类对象分配给超类类型?

来自分类Dev

将单位类型分配给变量

来自分类Dev

将Integer类型分配给int

来自分类Dev

将任何类型分配给变量

来自分类Dev

参数类型“ A”不能分配给类型“ B”吗?

来自分类Dev

参数类型“对象”不能分配给参数类型“ System.Windows.Forms.Control”

来自分类Dev

参数类型对象不可分配给参数类型'Sitecore.Data.Items.Item'

来自分类Dev

打字稿-指定类型的对象无法分配给通用类型

来自分类Dev

Angular 中的新 HttpClient / HttpGetModule “类型‘对象’不可分配给类型”

来自分类Dev

TS2322:类型“对象”不可分配给类型“商店”

来自分类Dev

错误 TS2322:“对象”类型不可分配给“产品”类型

来自分类Dev

Automapper如何将一个对象的属性分配给相同类型的两个对象的属性

来自分类Dev

定义移动分配运算符时,如何将包含unique_ptr的对象分配给其类型的矢量?

来自分类Dev

分配给类型'char [100]'时不兼容的类型

来自分类Dev

无法将类型“ MyClass”的值分配给类型“ MFMailComposeViewControllerDelegate!”!

Related 相关文章

  1. 1

    将变量分配给相同类型的对象时,类型不匹配错误

  2. 2

    将匿名对象分配给类型属性时,TypeScript是否会推断强制类型转换?

  3. 3

    将通用对象分配给Partial类型

  4. 4

    当listIterator用作引用类型时,分配给它的对象必须实现它吗?

  5. 5

    C ++将类型A的变量分配给扩展了A的类型B

  6. 6

    类型对象不可分配给类型 any[]

  7. 7

    当使用=将一个对象分配给另一个对象时,将进行复制类型

  8. 8

    当推入存储在对象中的数组时,类型的参数不能分配给类型错误的参数

  9. 9

    如何检查分配给变量的对象的类型是否正确?

  10. 10

    类型安全分配给字符串中键的对象

  11. 11

    无法将对象分配给文字类型

  12. 12

    将类型分配给Maybe类型的嵌套类型的属性

  13. 13

    调用方法vs将对象分配给方法AND空返回类型vs对象返回类型

  14. 14

    即使是强类型,也将值作为字符串分配给对象

  15. 15

    这段代码如何将子类对象分配给超类类型?

  16. 16

    将单位类型分配给变量

  17. 17

    将Integer类型分配给int

  18. 18

    将任何类型分配给变量

  19. 19

    参数类型“ A”不能分配给类型“ B”吗?

  20. 20

    参数类型“对象”不能分配给参数类型“ System.Windows.Forms.Control”

  21. 21

    参数类型对象不可分配给参数类型'Sitecore.Data.Items.Item'

  22. 22

    打字稿-指定类型的对象无法分配给通用类型

  23. 23

    Angular 中的新 HttpClient / HttpGetModule “类型‘对象’不可分配给类型”

  24. 24

    TS2322:类型“对象”不可分配给类型“商店”

  25. 25

    错误 TS2322:“对象”类型不可分配给“产品”类型

  26. 26

    Automapper如何将一个对象的属性分配给相同类型的两个对象的属性

  27. 27

    定义移动分配运算符时,如何将包含unique_ptr的对象分配给其类型的矢量?

  28. 28

    分配给类型'char [100]'时不兼容的类型

  29. 29

    无法将类型“ MyClass”的值分配给类型“ MFMailComposeViewControllerDelegate!”!

热门标签

归档