小编Ser*_*sky的帖子

类型 { [x: 字符串]: T[S]; } 不可分配给类型 'Partial<T>'

我有这个代码部分,非常简单:

interface A {
    z: string;
    y: number;
}

let newA = <T, S extends keyof T>(key: S, value: T[S]): Partial<T> => {
    return {[key]: value};
}
Run Code Online (Sandbox Code Playgroud)

我看到一条错误消息: Type '{ [x: string]: T[S]; }' is not assignable to type 'Partial<T>'

我可以假设问题与 相关{},它总是映射keystring

但即使有明确的类型说那应该是string我没有结果

只有一种可行的解决方案是删除Partial<T>,但这不是一个好的解决方案

希望能从一些专家级的typescript人那里得到一些答案,他们可以描述该问题的机制,并得到这种情况的解决方案

笔记!该问题仅与一般情况有关。没有这个一切都会好起来的。

使用此代码的 Typescript Playground

typescript typescript-generics typescript-typings

6
推荐指数
1
解决办法
1020
查看次数

使用Apache Thrift在Nativescript + Angular中'无法读取未定义的'浏览器属性''

我试图在我的Angular&Nativescript项目中使用Apache Thrift,但是通过'tns Preview --bundle'或任何其他tns命令,我得到了

TypeError: Cannot read property 'browser' of undefined
File: "<unknown>, line: 1, column: 265
Run Code Online (Sandbox Code Playgroud)

Apache Thrift版本0.11.0 / 1.0.0dev,Angular版本7.1.0,Nativescript版本5.1.0

在platform / android / app / src / main / assets / app / vendor.js中,我可以看到:

/* istanbul ignore next */
if (undefined.browser) {
    defaultEncoding = 'utf-8'
} else {
    var pVersionMajor = parseInt(undefined.version.split('.')[0].slice(1), 10)
Run Code Online (Sandbox Code Playgroud)

当我期望类似之类的东西时global.process.browser,我可以在vendor.js中找到另一种平静。在另一个平静中,我可以看到类似的东西undefined.nextTick(...)。我知道这是某种巴别塔问题,但我不知道如何解决。

我使用thrift --gen js:node脚本生成我的节俭文件(错误没有意义)。没有它们,所有的作品都很酷,但是后来我试图从Thrift执行任何Thrift生成的文件/任何模块,我在上面遇到了一个异常。my_component.ts

import { Component, OnInit } from '@angular/core';
import { TJSONProtocol } from 'thrift'; // or …
Run Code Online (Sandbox Code Playgroud)

thrift babel webpack nativescript angular

3
推荐指数
1
解决办法
520
查看次数

如何使用接口避免“后续属性声明必须具有相同的类型”

我有一些接口,它有一个枚举字段。还想为此接口进行重载,这将在某些特定枚举值的情况下再采用一个属性。

举个例子:

enum CellValueType {
    DATE,
    STRING,
    NUMBER
}


export interface TableCell {
    type: CellValueType;
    value: string; // ...
}

export interface TableCell {
    type: CellValueType.DATE;
    format: string; // Should be exist only on the DATE type
    value: string; // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,问题是使用接口时出现错误:

后续的属性声明必须具有相同的类型。属性“type”必须是“CellValueType”类型,但此处的类型是“CellValueType.DATE”。

错误是可以理解的,没有疑问。

主要问题是如何通过合法途径避免这种情况的发生。

我知道,我可以使用type而不是interface得到这个结构:

export type TableCell = {
    type: CellValueType;
    value: string;
} | {
    type: CellValueType.DATE;
    format: string; 
    value: string;
}
Run Code Online (Sandbox Code Playgroud)

工作得很好,但问题是类无法实现联合类型。


未按预期工作,但DATE仍与第一个签名兼容。为了正确工作,需要将其type: CellValueType更改为type: Exclude<CellValueType, …

overloading typescript

2
推荐指数
1
解决办法
6221
查看次数